有两个 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_info 和 foreign_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';