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å GetSchemaTable SqliteDataReader. Den returnerade DataTable innehåller följande kolumner:

Column Type Beskrivning
AllowDBNull Booleskt Sant om ursprungskolumnen kan vara NULL.
BaseCatalogName String Namnet på ursprungskolumnens databas. Alltid NULL för uttryck.
BaseColumnName String Ursprungskolumnens namn som inte har samma namn. Alltid NULL för uttryck.
BaseSchemaName String Alltid NULL. SQLite stöder inte scheman.
BaseServerName String Sökvägen till databasfilen som anges i anslutningssträng.
BaseTableName String Namnet på ursprungskolumnens tabell. Alltid NULL för uttryck.
ColumnName String 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 String SQLite-datatypen för kolumnen.
IsAliased Booleskt Sant om kolumnnamnet är alias i resultatuppsättningen.
IsAutoIncrement Booleskt Sant om ursprungskolumnen skapades med nyckelordet AUTOINCREMENT.
IsExpression Booleskt Sant om kolumnen kommer från ett uttryck i frågan.
IsKey Booleskt Sant om ursprungskolumnen är en del av primärnyckeln.
IsUnique Booleskt 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 Db Anslut ion. 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