다음을 통해 공유


메타데이터(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_infoforeign_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';

참고 항목