Поделиться через


Метаданные (Sqlite)

Существует два API для получения метаданных в ADO.NET. Один извлекает метаданные о результатах запроса. Другой извлекает метаданные о схеме базы данных.

Метаданные результатов запроса

Вы можете получить метаданные о результатах запроса с помощью GetSchemaTable метода SqliteDataReader. Возвращенный DataTable содержит следующие столбцы:

колонна Тип Описание
AllowDBNull Булев тип Значение 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 Булев тип Это истинно, если имя столбца используется как псевдоним в результирующем наборе.
IsAutoIncrement Булев тип Значение true, если столбец источника был создан с помощью ключевого слова AUTOINCREMENT.
IsExpression Булев тип True, если столбец берёт начало из выражения в запросе.
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 не реализует метод 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';

См. также