Metadata (Sqlite)

Pro načítání metadat v ADO.NET existují dvě rozhraní API. Jeden načte metadata o výsledcích dotazu. Druhý načte metadata o schématu databáze.

Metadata výsledků dotazu

Metadata o výsledcích dotazu můžete načíst pomocí GetSchemaTable metody on SqliteDataReader. Vrácená DataTable hodnota obsahuje následující sloupce:

Sloupec Typ Popis
AllowDBNull logický Hodnota True, pokud sloupec původu může mít hodnotu NULL.
BaseCatalogName Řetězec Název databáze původního sloupce. Vždy NULL pro výrazy.
BaseColumnName Řetězec Nealiasovaný název původního sloupce. Vždy NULL pro výrazy.
BaseSchemaName Řetězec Vždy NULL. SQLite nepodporuje schémata.
BaseServerName Řetězec Cesta k databázovému souboru zadanému v připojovacím řetězci.
BaseTableName Řetězec Název původní tabulky sloupce. Vždy NULL pro výrazy.
ColumnName Řetězec Název nebo alias sloupce v sadě výsledků
ColumnOrdinal Int32 Pořadové číslo sloupce v sadě výsledků.
ColumnSize Int32 Vždy -1. To se může změnit v budoucích verzíchMicrosoft.Data.Sqlite.
DataType Typ Výchozí datový typ .NET sloupce.
DataTypeName Řetězec Datový typ SQLite sloupce.
IsAliased logický Hodnota True, pokud je název sloupce aliasovaný v sadě výsledků.
IsAutoIncrement logický Hodnota True, pokud byl sloupec původu vytvořen pomocí klíčového slova AUTOINCREMENT.
IsExpression logický Hodnota True, pokud sloupec pochází z výrazu v dotazu.
IsKey logický Hodnota True, pokud je sloupec původu součástí PRIMÁRNÍHO KLÍČE.
IsUnique logický Hodnota True, pokud je sloupec původu JEDINEČNÝ.
NumericPrecision Int16 Vždy NULL. To se může změnit v budoucích verzíchMicrosoft.Data.Sqlite.
NumericScale Int16 Vždy NULL. To se může změnit v budoucích verzíchMicrosoft.Data.Sqlite.

Následující příklad ukazuje, jak použít GetSchemaTable k vytvoření ladicího řetězce, který zobrazuje metadata o výsledku.

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();

Například tento dotaz by vytvořil následující ladicí řetězec:

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

Metadata schématu

Microsoft.Data.Sqlite neimplementuje metodu GetSchema ve službě DbConnection. Místo toho můžete dotazovat přímo na informace o schématu pomocí tabulky sqlite_master a příkazů PRAGMA, jako table_info a foreign_key_list.

Tento dotaz například načte metadata o všech sloupcích v databázi.

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';

Viz také