Freigeben über


Metadaten (Sqlite)

Es gibt zwei APIs zum Abrufen von Metadaten in ADO.NET. Die eine RUFT Metadaten zu Abfrageergebnissen ab, die andere ruft Metadaten über das Datenbankschema ab.

Metadaten für Abfrageergebnisse

Mithilfe der GetSchemaTable-Methode in SqliteDataReader können Sie Metadaten zu den Ergebnissen einer Abfrage abrufen. Die zurückgegebene DataTable-Klasse enthält die folgenden Spalten:

Spalte Type Beschreibung
AllowDBNull Boolesch true, wenn die Ursprungsspalte möglicherweise NULL ist
BaseCatalogName Zeichenfolge Der Datenbankname der Ursprungsspalte, für Ausdrücke immer NULL
BaseColumnName Zeichenfolge Der Name der Ursprungsspalte ohne Alias, für Ausdrücke immer NULL
BaseSchemaName Zeichenfolge Immer NULL, SQLite unterstützt keine Schemas.
BaseServerName Zeichenfolge Der Pfad zur Datenbankdatei, der in der Verbindungszeichenfolge angegeben ist
BaseTableName Zeichenfolge Der Tabellenname der Ursprungsspalte, für Ausdrücke immer NULL
ColumnName Zeichenfolge Der Name oder Alias der Spalte im Resultset
ColumnOrdinal Int32 Die Ordnungszahl der Spalte im Resultset
ColumnSize Int32 Immer -1, kann sich in zukünftigen Versionen von Microsoft.Data.Sqlite ändern
DataType Typ Der .NET-Standard-Datentyp der Spalte
DataTypeName Zeichenfolge Der SQLite-Datentyp der Spalte
IsAliased Boolesch true, wenn der Spaltenname im Resultset ein Alias ist.
IsAutoIncrement Boolesch true, wenn die Ursprungsspalte mit dem AUTOINCREMENT-Schlüsselwort erstellt wurde
IsExpression Boolesch true, wenn die Spalte aus einem Ausdruck in der Abfrage stammt
IsKey Boolesch true, wenn die Ursprungsspalte Teil von PRIMARY KEY ist
IsUnique Boolesch true, wenn die Ursprungsspalte UNIQUE ist
NumericPrecision Int16 Immer NULL, kann sich in zukünftigen Versionen von Microsoft.Data.Sqlite ändern
NumericScale Int16 Immer NULL, kann sich in zukünftigen Versionen von Microsoft.Data.Sqlite ändern

Im folgenden Beispiel wird veranschaulicht, wie GetSchemaTable verwendet wird, um eine Debugzeichenfolge zu erstellen, die Metadaten zu einem Ergebnis anzeigt:

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

Diese Abfrage erzeugt z. B. die folgende Debugzeichenfolge:

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

Metadaten für Schemas

Microsoft.Data.Sqlite implementiert die GetSchema-Methode nicht in DbConnection. Stattdessen können Sie mithilfe der Tabelle sqlite_master und Pragmaanweisungen wie table_info und foreign_key_list direkte Abfragen für Schemainformationen ausführen.

Diese Abfrage ruft z. B. Metadaten zu allen Spalten in der Datenbank ab.

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

Siehe auch