Megosztás:


Metaadatok (Sqlite)

Két API van az ADO.NET-ben a metaadatok lekérésére. Az egyik lekéri a lekérdezési eredmények metaadatait. A másik az adatbázisséma metaadatait kéri le.

Lekérdezés eredményének metaadatai

A lekérdezés eredményeire vonatkozó metaadatokat a GetSchemaTable következő metódussal SqliteDataReaderkérdezheti le: . A visszaadott DataTable oszlop a következő oszlopokat tartalmazza:

oszlop Típus Leírás
AllowDBNull logikai Igaz, ha a forrásoszlop null értékű lehet.
BaseCatalogName Lánc A forrásoszlop adatbázisának neve. A kifejezésekhez mindig NULL érték szükséges.
BaseColumnName Lánc A forrásoszlop közvetlen neve. A kifejezésekhez mindig NULL érték szükséges.
BaseSchemaName Lánc Mindig NULL. Az SQLite nem támogatja a sémákat.
BaseServerName Lánc A kapcsolati sztringben megadott adatbázisfájl elérési útja.
BaseTableName Lánc Az eredet oszlop táblájának neve. A kifejezésekhez mindig NULL érték szükséges.
ColumnName Lánc Az eredményhalmaz oszlopának neve vagy aliasa.
ColumnOrdinal Int32 Az oszlop sorszáma az eredményhalmazban.
ColumnSize Int32 Mindig -1. Ez a későbbi verziókban Microsoft.Data.Sqliteváltozhat.
DataType Típus Az oszlop alapértelmezett .NET-adattípusa.
DataTypeName Lánc Az oszlop SQLite adattípusa.
IsAliased logikai Igaz, ha az oszlop neve aliasként szerepel az eredményhalmazban.
IsAutoIncrement logikai Igaz, ha a forrásoszlop az AUTOINCREMENT kulcsszóval lett létrehozva.
IsExpression logikai Igaz, ha az oszlop a lekérdezés egyik kifejezéséből származik.
IsKey logikai Igaz, ha a forrásoszlop az ELSŐDLEGES KULCS része.
IsUnique logikai Igaz, ha a forrásoszlop EGYEDI.
NumericPrecision Int16 Mindig NULL. Ez a későbbi verziókban Microsoft.Data.Sqliteváltozhat.
NumericScale Int16 Mindig NULL. Ez a későbbi verziókban Microsoft.Data.Sqliteváltozhat.

Az alábbi példa bemutatja, hogyan hozhat GetSchemaTable létre hibakeresési sztringet, amely az eredmény metaadatait jeleníti meg:

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

Ez a lekérdezés például a következő hibakeresési sztringet hozza létre:

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

Séma metaadatai

A Microsoft.Data.Sqlite nem implementálja a GetSchema metódust a DbConnectionon. Ehelyett közvetlenül a sémaadatokat kérdezheti le a sqlite_master tábla és a PRAGMA utasítások, például a table_info és a foreign_key_list használatával.

Ez a lekérdezés például lekéri az adatbázis összes oszlopának metaadatait.

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

Lásd még