Sdílet prostřednictvím


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:

Column Type Popis
AllowDBNull Logické Hodnota True, pokud sloupec původu může mít hodnotu NULL.
BaseCatalogName String Název databáze původního sloupce. Vždy NULL pro výrazy.
BaseColumnName String Unaliased name of the origin column. Vždy NULL pro výrazy.
BaseSchemaName String Vždy NULL. SQLite nepodporuje schémata.
BaseServerName String Cesta k databázovému souboru zadanému v připojovací řetězec.
BaseTableName String Název původní tabulky sloupce. Vždy NULL pro výrazy.
ColumnName String 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ích .Microsoft.Data.Sqlite
DataType Typ Výchozí datový typ .NET sloupce.
DataTypeName String Datový typ SQLite sloupce.
IsAliased Logická hodnota Hodnota True, pokud je název sloupce aliasovaný v sadě výsledků.
IsAutoIncrement Logická hodnota Hodnota True, pokud byl sloupec původu vytvořen pomocí klíčového slova AUTOINCREMENT.
IsExpression Logická hodnota Hodnota True, pokud sloupec pochází z výrazu v dotazu.
IsKey Logická hodnota Hodnota True, pokud je sloupec původu součástí PRIMÁRNÍHO KLÍČE.
IsUnique Logická hodnota Hodnota True, pokud je sloupec původu JEDINEČNÝ.
NumericPrecision Int16 Vždy NULL. To se může změnit v budoucích verzích .Microsoft.Data.Sqlite
NumericScale Int16 Vždy NULL. To se může změnit v budoucích verzích .Microsoft.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();

Tento dotaz by například 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ě Db Připojení ion. Místo toho můžete dotazovat přímo na informace o schématu pomocí tabulek sqlite_master a příkazů PRAGMA, jako jsou 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é