Bagikan melalui


Metadata (Sqlite)

Ada dua API untuk mengambil metadata di ADO.NET. Satu mengambil metadata tentang hasil kueri. Yang lain mengambil metadata tentang skema database.

Metadata hasil kueri

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

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

Contoh berikut menunjukkan cara menggunakan GetSchemaTable untuk membuat string debug yang menampilkan metadata tentang suatu 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

Metadata skema

Microsoft.Data.Sqlite tidak mengimplementasikan metode GetSchema di DbConnection. Sebagai gantinya, Anda dapat langsung menanyakan informasi skema 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