元数据(Sqlite)

有两个 API 可用于检索 ADO.NET 中的元数据。 一个检索有关查询结果的元数据。 另一个检索有关数据库架构的元数据。

查询结果元数据

可以使用GetSchemaTable方法在SqliteDataReader上检索有关查询结果的元数据。 返回的 DataTable 包含以下列:

类型 DESCRIPTION
AllowDBNull 布尔 如果源列可以为 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 布尔 如果列名在结果集中具有别名,则为 True。
IsAutoIncrement 布尔 如此 如果源列是使用 AUTOINCREMENT 关键字创建的。
IsExpression 布尔 为真 如果列源自查询中的表达式。
IsKey 布尔 如果原点列是主键的一部分,则为 True。
IsUnique 布尔 如果源列是唯一的,则为真。
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';

另请参阅