Метаданные (Sqlite)
В ADO.NET есть два интерфейса API для получения метаданных. Один из них извлекает метаданные о результатах запроса. Второй извлекает метаданные о схеме базы данных.
Запрос метаданных результата
Метаданные о результатах запроса можно получить с помощью метода GetSchemaTable для SqliteDataReader
. В ответ возвращается DataTable со следующими столбцами.
Column | Type | Описание |
---|---|---|
AllowDBNull |
Boolean | True, если исходный столбец принимает значения NULL. |
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 |
Логический | True, если исходный столбец был создан с применением ключевого слова AUTOINCREMENT. |
IsExpression |
Логический | True, если столбец создавался из выражения в запросе. |
IsKey |
Логический | True, если исходный столбец входит в PRIMARY KEY. |
IsUnique |
Логический | True, если исходный столбец имеет атрибут UNIQUE. |
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 не реализует метод GetSchema для DbConnection. Но вы можете напрямую запросить сведения о схеме, используя таблицу 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';