Udostępnij przez


Metadane (Sqlite)

Istnieją dwa interfejsy API do pobierania metadanych w ADO.NET. Pobiera metadane dotyczące wyników zapytania. Inne pobiera metadane dotyczące schematu bazy danych.

Metadane wyników zapytania

Metadane dotyczące wyników zapytania można pobrać przy użyciu GetSchemaTable metody w pliku SqliteDataReader. Zwrócona kolumna DataTable zawiera następujące kolumny:

Kolumna Typ Opis
AllowDBNull logiczny Wartość True, jeśli kolumna źródła może mieć wartość NULL.
BaseCatalogName Sznurek Nazwa bazy danych kolumny pochodzenia. Zawsze wartość NULL dla wyrażeń.
BaseColumnName Sznurek Nieprzyzwajona nazwa kolumny źródła. Zawsze wartość NULL dla wyrażeń.
BaseSchemaName Sznurek Zawsze ma wartość NULL. SqLite nie obsługuje schematów.
BaseServerName Sznurek Ścieżka do pliku bazy danych określona w parametrach połączenia.
BaseTableName Sznurek Nazwa tabeli, do której należy kolumna pochodzenia. Zawsze wartość NULL dla wyrażeń.
ColumnName Sznurek Nazwa lub alias kolumny w zestawie wyników.
ColumnOrdinal Int32 Indeks kolumny w zestawie wyników.
ColumnSize Int32 Zawsze -1. Może to ulec zmianie w przyszłych wersjach programu Microsoft.Data.Sqlite.
DataType Typ Domyślny typ danych kolumny w .NET.
DataTypeName Sznurek Typ danych SQLite kolumny.
IsAliased logiczny Wartość True, jeśli nazwa kolumny jest aliasowana w zestawie wyników.
IsAutoIncrement logiczny Wartość True, jeśli kolumna źródła została utworzona za pomocą słowa kluczowego AUTOINCREMENT.
IsExpression logiczny Prawda, jeśli kolumna pochodzi z wyrażenia w zapytaniu.
IsKey logiczny Prawda, jeśli kolumna źródłowa jest częścią KLUCZA GŁÓWNEGO.
IsUnique logiczny Wartość True, jeśli kolumna źródła ma wartość UNIQUE.
NumericPrecision Int16 Zawsze ma wartość NULL. Może to ulec zmianie w przyszłych wersjach programu Microsoft.Data.Sqlite.
NumericScale Int16 Zawsze ma wartość NULL. Może to ulec zmianie w przyszłych wersjach programu Microsoft.Data.Sqlite.

W poniższym przykładzie pokazano, jak użyć GetSchemaTable do utworzenia łańcucha znaków debugowania, który pokazuje metadane dotyczące wyniku.

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

Na przykład to zapytanie spowoduje wygenerowanie następującego ciągu debugowania:

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

Metadane schematu

Microsoft.Data.Sqlite nie implementuje metody GetSchema w dbConnection. Zamiast tego można wykonywać zapytania bezpośrednio w celu uzyskania informacji o schemacie przy użyciu tabel sqlite_master i instrukcji PRAGMA, takich jak table_info i foreign_key_list.

Na przykład to zapytanie pobierze metadane dotyczące wszystkich kolumn w bazie danych.

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

Zobacz także