使用英语阅读

通过


元数据 (Sqlite)

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

查询结果元数据

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

类型​​ 说明
AllowDBNull Boolean 如果原点列可以为 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 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';

请参阅