中繼資料 (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_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';