Dela via


Metadata (Sqlite)

Det finns två API:er för att hämta metadata i ADO.NET. En hämtar metadata om frågeresultat. Den andra hämtar metadata om databasschemat.

Metadata för frågeresultat

Du kan hämta metadata om resultatet av en fråga med hjälp av metoden på GetSchemaTableSqliteDataReader. Den returnerade DataTable innehåller följande kolumner:

Kolumn Typ Beskrivning
AllowDBNull Boolesk Sant om ursprungskolumnen kan vara NULL.
BaseCatalogName Sträng Namnet på ursprungskolumnens databas. Alltid NULL för uttrycksvärden.
BaseColumnName Sträng Det oaliariserade namnet på ursprungskolumnen. Alltid NULL för uttrycksvärden.
BaseSchemaName Sträng Alltid NULL. SQLite stöder inte scheman.
BaseServerName Sträng Sökvägen till databasfilen som anges i anslutningssträngen.
BaseTableName Sträng Namnet på ursprungskolumnens tabell. Alltid NULL för uttrycksvärden.
ColumnName Sträng Namnet eller aliaset för kolumnen i resultatuppsättningen.
ColumnOrdinal Int32 Ordningstalet för kolumnen i resultatuppsättningen.
ColumnSize Int32 Alltid -1. Detta kan ändras i framtida versioner av Microsoft.Data.Sqlite.
DataType Typ Standarddatatypen .NET för kolumnen.
DataTypeName Sträng SQLite-datatypen för kolumnen.
IsAliased Boolesk Sant om kolumnnamnet är aliasat i resultatsettet.
IsAutoIncrement Boolesk Sant om ursprungskolumnen skapades med nyckelordet AUTOINCREMENT.
IsExpression Boolesk sant om kolumnen kommer från ett uttryck i frågan.
IsKey Boolesk Sant om ursprungskolumnen är en del av primärnyckeln.
IsUnique Boolesk Sant om ursprungskolumnen är UNIK.
NumericPrecision Int16 Alltid NULL. Detta kan ändras i framtida versioner av Microsoft.Data.Sqlite.
NumericScale Int16 Alltid NULL. Detta kan ändras i framtida versioner av Microsoft.Data.Sqlite.

I följande exempel visas hur du använder GetSchemaTable för att skapa en felsökningssträng som visar metadata om ett resultat:

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

Den här frågan skulle till exempel generera följande felsökningssträng:

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

Schemametadata

Microsoft.Data.Sqlite implementerar inte metoden GetSchema i DbConnection. I stället kan du fråga direkt efter schemainformation med hjälp av sqlite_master-tabellen och PRAGMA-instruktioner som table_info och foreign_key_list.

Den här frågan hämtar till exempel metadata om alla kolumner i databasen.

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

Se även