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