다음을 통해 공유


메타데이터(Sqlite)

ADO.NET 메타데이터를 검색하기 위한 두 가지 API가 있습니다. 하나는 쿼리 결과에 대한 메타데이터를 검색합니다. 다른 하나는 데이터베이스 스키마에 대한 메타데이터를 검색합니다.

쿼리 결과 메타데이터

GetSchemaTable 메서드를 사용하여 SqliteDataReader에서 쿼리 결과의 메타데이터를 검색할 수 있습니다. 반환 DataTable 된 열에는 다음 열이 포함됩니다.

칼럼 유형 설명
AllowDBNull 불리언 (Boolean) 원본 열이 NULL일 수 있으면 True입니다.
BaseCatalogName 문자열 원본 열 데이터베이스의 이름입니다. 식 표현은 항상 NULL입니다.
BaseColumnName 문자열 원본 열의 별칭이 없는 이름입니다. 식 표현은 항상 NULL입니다.
BaseSchemaName 문자열 항상 NULL입니다. SQLite는 스키마를 지원하지 않습니다.
BaseServerName 문자열 연결 문자열에 지정된 데이터베이스 파일의 경로입니다.
BaseTableName 문자열 원본 열이 속한 테이블의 이름입니다. 식 표현은 항상 NULL입니다.
ColumnName 문자열 결과 집합에 있는 열의 이름 또는 별칭입니다.
ColumnOrdinal Int32 결과 집합에 있는 열의 서수입니다.
ColumnSize Int32 항상 -1. 이는 이후 버전의 Microsoft.Data.Sqlite.에서 변경될 수 있습니다.
DataType 유형 열의 기본 .NET 데이터 형식입니다.
DataTypeName 문자열 열의 SQLite 데이터 형식입니다.
IsAliased 불리언 (Boolean) 열 이름이 결과 집합에서 별칭으로 지정된 경우 True입니다.
IsAutoIncrement 불리언 (Boolean) 원본 열이 AUTOINCREMENT 키워드를 사용하여 만들어진 경우 True입니다.
IsExpression 불리언 (Boolean) 열이 쿼리의 식에서 유래하는 경우 True입니다.
IsKey 불리언 (Boolean) 원본 열이 기본 키의 일부이면 True입니다.
IsUnique 불리언 (Boolean) 원본 열이 UNIQUE이면 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 테이블과 table_infoforeign_key_list와 같은 PRAGMA 문을 사용하여 스키마 정보를 직접 쿼리할 수 있습니다.

예를 들어 이 쿼리는 데이터베이스의 모든 열에 대한 메타데이터를 검색합니다.

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';

참고하십시오