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


Метаданные (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';

См. также