Freigeben über


Metadaten (Sqlite)

Es gibt zwei APIs zum Abrufen von Metadaten in ADO.NET. Eine ruft Metadaten zu Abfrageergebnissen ab. Die andere ruft Metadaten zum Datenbankschema ab.

Abfrageergebnismetadaten

Mithilfe der GetSchemaTable Methode SqliteDataReaderkönnen Sie Metadaten zu den Ergebnissen einer Abfrage abrufen. Die zurückgegebene DataTable Enthält die folgenden Spalten:

Kolumne Typ BESCHREIBUNG
AllowDBNull Boolescher Typ (Boolean) True, wenn die Ursprungsspalte NULL sein kann.
BaseCatalogName Schnur Der Datenbankname der Ursprungsspalte, für Ausdrücke immer NULL
BaseColumnName Schnur Der Name der Ursprungsspalte ohne Alias, für Ausdrücke immer NULL
BaseSchemaName Schnur Immer NULL. SQLite unterstützt keine Schemas.
BaseServerName Schnur Der Pfad zu der Datenbankdatei, die in der Verbindungszeichenfolge angegeben ist.
BaseTableName Schnur Der Tabellenname der Ursprungsspalte, für Ausdrücke immer NULL
ColumnName Schnur 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 standardmäßige .NET-Datentyp der Spalte.
DataTypeName Schnur Der SQLite-Datentyp der Spalte.
IsAliased Boolescher Typ (Boolean) true, wenn der Spaltenname im Resultset ein Alias ist.
IsAutoIncrement Boolescher Typ (Boolean) True, wenn die Ursprungsspalte mit dem Schlüsselwort AUTOINCREMENT erstellt wurde.
IsExpression Boolescher Typ (Boolean) True, wenn die Spalte aus einem Ausdruck in der Abfrage stammt.
IsKey Boolescher Typ (Boolean) true, wenn die Ursprungsspalte Teil von PRIMARY KEY ist
IsUnique Boolescher Typ (Boolean) 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

Das folgende Beispiel zeigt, wie Sie GetSchemaTable verwenden, 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 würde z. B. die folgende Debugzeichenfolge erzeugen:

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

Schemametadaten

Microsoft.Data.Sqlite implementiert die GetSchema-Methode nicht für DbConnection. Stattdessen können Sie mithilfe der sqlite_master Tabellen- und PRAGMA-Anweisungen wie table_info und foreign_key_list direkt Schemainformationen abfragen.

Diese Abfrage ruft beispielsweise 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