메타데이터(Sqlite)
ADO.NET에서 메타데이터를 검색하기 위한 두 가지 API가 있습니다. 하나는 쿼리 결과에 대한 메타데이터를 검색합니다. 다른 하나는 데이터베이스 스키마에 대한 메타데이터를 검색합니다.
쿼리 결과 메타데이터
SqliteDataReader
에서 GetSchemaTable 메서드를 사용하여 쿼리 결과에 대한 메타데이터를 검색할 수 있습니다. 반환된 DataTable에는 다음과 같은 열이 포함되어 있습니다.
Column | Type | 설명 |
---|---|---|
AllowDBNull |
Boolean | 원본 열이 NULL일 수 있으면 True입니다. |
BaseCatalogName |
문자열 | 원본 열의 데이터베이스 이름입니다. 식의 경우 항상 NULL입니다. |
BaseColumnName |
문자열 | 원본 열의 unaliased 이름입니다. 식의 경우 항상 NULL입니다. |
BaseSchemaName |
문자열 | 항상 NULL입니다. SQLite는 스키마를 지원하지 않습니다. |
BaseServerName |
문자열 | 연결 문자열에 지정된 데이터베이스 파일에 대한 경로입니다. |
BaseTableName |
문자열 | 원본 열의 테이블 이름입니다. 식의 경우 항상 NULL입니다. |
ColumnName |
문자열 | 결과 집합에 있는 열의 이름 또는 별칭입니다. |
ColumnOrdinal |
Int32 | 결과 집합에 있는 열의 서수입니다. |
ColumnSize |
Int32 | 항상 -1입니다. 이는 Microsoft.Data.Sqlite 의 이후 버전에서 변경될 수 있습니다. |
DataType |
Type | 열의 기본 .NET 데이터 형식입니다. |
DataTypeName |
문자열 | 열의 SQLite 데이터 형식입니다. |
IsAliased |
Boolean | 결과 집합에서 열 이름이 별칭이면 True입니다. |
IsAutoIncrement |
Boolean | 원본 열이 AUTOINCREMENT 키워드로 만들어진 경우 True입니다. |
IsExpression |
Boolean | 열이 쿼리의 식에서 생성된 경우 True입니다. |
IsKey |
Boolean | 원본 열이 기본 키의 일부이면 True입니다. |
IsUnique |
Boolean | 원본 열이 고유한 경우 True입니다. |
NumericPrecision |
Int16 | 항상 NULL입니다. 이는 Microsoft.Data.Sqlite 의 이후 버전에서 변경될 수 있습니다. |
NumericScale |
Int16 | 항상 NULL입니다. 이는 Microsoft.Data.Sqlite 의 이후 버전에서 변경될 수 있습니다. |
다음 예제에서는 GetSchemaTable
을 사용하여 결과에 대한 메타데이터를 표시하는 디버그 문자열을 만드는 방법을 보여줍니다.
var builder = new StringBuilder();
var schemaTable = reader.GetSchemaTable();
foreach (DataRow column in schemaTable.Rows)
{
if ((bool)column[SchemaTableColumn.IsExpression])
{
builder.Append("(expression)");
}
else
{
builder.Append(column[SchemaTableColumn.BaseTableName])
.Append(".")
.Append(column[SchemaTableColumn.BaseColumnName]);
}
builder.Append(" ");
if ((bool)column[SchemaTableColumn.IsAliased])
builder.Append("AS ")
.Append(column[SchemaTableColumn.ColumnName])
.Append(" ");
builder.Append(column["DataTypeName"])
.Append(" ");
if (column[SchemaTableColumn.AllowDBNull] as bool? == false)
builder.Append("NOT NULL ");
if (column[SchemaTableColumn.IsKey] as bool? == true)
builder.Append("PRIMARY KEY ");
if (column[SchemaTableOptionalColumn.IsAutoIncrement] as bool? == true)
builder.Append("AUTOINCREMENT ");
if (column[SchemaTableColumn.IsUnique] as bool? == true)
builder.Append("UNIQUE ");
builder.AppendLine();
}
var debugString = builder.ToString();
예를 들어 이 쿼리는 다음과 같은 디버그 문자열을 생성합니다.
SELECT id AS post_id,
title,
body,
random() AS random
FROM post
post.id AS post_id INTEGER PRIMARY KEY AUTOINCREMENT
post.title TEXT NOT NULL UNIQUE
post.body TEXT
(expression) AS random BLOB
스키마 메타데이터
Microsoft.Data.Sqlite는 DbConnection에서 GetSchema 메서드를 구현하지 않습니다. 대신 sqlite_master 테이블과 PRAGMA 문(예: table_info 및 foreign_key_list)을 사용하여 스키마 정보를 직접 쿼리할 수 있습니다.
예를 들어 이 쿼리는 데이터베이스의 모든 열에 대한 메타데이터를 검색합니다.
SELECT t.name AS tbl_name, c.name, c.type, c.notnull, c.dflt_value, c.pk
FROM sqlite_master AS t,
pragma_table_info(t.name) AS c
WHERE t.type = 'table';
참고 항목
GitHub에서 Microsoft와 공동 작업
이 콘텐츠의 원본은 GitHub에서 찾을 수 있으며, 여기서 문제와 끌어오기 요청을 만들고 검토할 수도 있습니다. 자세한 내용은 참여자 가이드를 참조하세요.
.NET