Metadata (Sqlite)

Ada dua API untuk mengambil metadata di ADO.NET. Seseorang mengambil metadata mengenai hasil kueri. Metadata tentang skema basis data diambil oleh yang lain.

Metadata hasil kueri

Anda dapat mengambil metadata tentang hasil kueri menggunakan GetSchemaTable metode pada SqliteDataReader. Yang dikembalikan DataTable berisi kolom berikut:

kolom Tipe Deskripsi
AllowDBNull Boolean True jika kolom asal mungkin NULL.
BaseCatalogName string Nama database kolom asal. Selalu bernilai NULL untuk semua ekspresi.
BaseColumnName string Nama kolom asal yang tidak dialihkan. Selalu bernilai NULL untuk semua ekspresi.
BaseSchemaName string Selalu NULL. SQLite tidak mendukung skema.
BaseServerName string Jalur ke file database yang ditentukan dalam string koneksi.
BaseTableName string Nama tabel dari kolom asal. Selalu bernilai NULL untuk semua ekspresi.
ColumnName string Nama atau alias kolom dalam tataan hasil.
ColumnOrdinal Int32 Ordinal kolom dalam tataan hasil.
ColumnSize Int32 Selalu -1. Ini dapat berubah dalam versi yang akan datang dari Microsoft.Data.Sqlite.
DataType Tipe Jenis data .NET yang default pada kolom.
DataTypeName string Jenis data SQLite dari kolom.
IsAliased Boolean True jika nama kolom diberi alias dalam tataan hasil.
IsAutoIncrement Boolean True jika kolom asal dibuat dengan kata kunci AUTOINCREMENT.
IsExpression Boolean Benar jika kolom berasal dari ekspresi dalam pernyataan.
IsKey Boolean True jika kolom asal adalah bagian dari KUNCI PRIMER.
IsUnique Boolean True jika kolom asal UNIK.
NumericPrecision Int16 Selalu NULL. Ini dapat berubah dalam versi yang akan datang dari Microsoft.Data.Sqlite.
NumericScale Int16 Selalu NULL. Ini dapat berubah dalam versi yang akan datang dari Microsoft.Data.Sqlite.

Contoh berikut menunjukkan cara menggunakan GetSchemaTable untuk membuat string debug yang memperlihatkan metadata tentang hasil:

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

Misalnya, kueri ini akan menghasilkan string debug berikut:

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

Skema metadata

Microsoft.Data.Sqlite tidak menerapkan metode GetSchema pada DbConnection. Sebagai gantinya, Anda dapat meminta informasi skema secara langsung menggunakan tabel sqlite_master dan pernyataan PRAGMA seperti table_info dan foreign_key_list.

Misalnya, kueri ini akan mengambil metadata tentang semua kolom dalam database.

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

Lihat juga