中繼資料 (Sqlite)

ADO.NET 中有兩個擷取中繼資料的 API。 一個會擷取關於查詢結果的中繼資料。 另一個會擷取關於資料庫結構描述的中繼資料。

查詢結果中繼資料

您可以使用 SqliteDataReader 上的 GetSchemaTable 方法來擷取關於查詢結果的中繼資料。 傳回的 DataTable 包含下列資料行:

資料行 類型​ 描述
AllowDBNull 布林值 如果來源資料行可能為 NULL,則為 True。
BaseCatalogName String 來源資料行的資料庫名稱。 運算式的一律為 NULL。
BaseColumnName String 來源資料行的非別名名稱。 運算式的一律為 NULL。
BaseSchemaName String 一律為 NULL。 SQLite 不支援結構描述。
BaseServerName String 連接字串中指定的資料庫檔案路徑。
BaseTableName String 來源資料行的資料表名稱。 運算式的一律為 NULL。
ColumnName String 結果集中的資料行名稱或別名。
ColumnOrdinal Int32 結果集中的資料行序數。
ColumnSize Int32 一律為 -1。 這在 Microsoft.Data.Sqlite 未來的版本中可能會有變更。
DataType 類型 資料行的預設 .NET 資料類型。
DataTypeName String 資料行的 SQLite 資料型別。
IsAliased 布林值 如果結果集中的資料行名稱為別名,則為 True。
IsAutoIncrement 布林值 如果來源資料行是以 AUTOINCREMENT 關鍵字建立的,則為 True。
IsExpression 布林值 如果資料行源自查詢中的運算式,則為 True。
IsKey 布林值 如果來源資料行是 PRIMARY KEY 的一部分,則為 True。
IsUnique 布林值 如果來源資料行是 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 資料表和 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';

另請參閱