メタデータ (Sqlite)

ADO.NET でメタデータを取得するための API は 2 つあります。 1 つは、クエリ結果に関するメタデータを取得します。 もう 1 つは、データベース スキーマに関するメタデータを取得します。

クエリ結果のメタデータ

SqliteDataReaderGetSchemaTable メソッドを使用して、クエリの結果に関するメタデータを取得できます。 返される DataTable には次の列が含まれます。

Column タイプ Description
AllowDBNull ブール型 元の列で NULL が許容される場合は true。
BaseCatalogName String 元の列のデータベースの名前。 式では常に NULL です。
BaseColumnName String 元の列の (別名ではない) 名前。 式では常に NULL です。
BaseSchemaName String 常に NULL です。 SQLite ではスキーマはサポートされません。
BaseServerName String 接続文字列の中で指定されたデータベース ファイルへのパス。
BaseTableName String 元の列のテーブルの名前。 式では常に NULL です。
ColumnName String 結果セット内の列の名前または別名。
ColumnOrdinal Int32 結果セット内の列の序数。
ColumnSize Int32 常に -1 です。 これは、将来のバージョンの Microsoft.Data.Sqlite では変更される可能性があります。
DataType 種類 列の既定の .NET データ型。
DataTypeName String 列の SQLite データ型。
IsAliased ブール型 結果セット内で列名に別名を使用する場合は true。
IsAutoIncrement ブール型 元の列が AUTOINCREMENT キーワードを使用して作成された場合は true。
IsExpression ブール型 列がクエリ内の式から生成される場合は true。
IsKey ブール型 元の列が PRIMARY KEY の一部である場合は true。
IsUnique ブール型 元の列が UNIQUE の場合は true。
NumericPrecision Int16 常に NULL です。 これは、将来のバージョンの Microsoft.Data.Sqlite では変更される可能性があります。
NumericScale Int16 常に NULL です。 これは、将来のバージョンの Microsoft.Data.Sqlite では変更される可能性があります。

次の例は、GetSchemaTable を使用して、結果に関するメタデータを表示するデバッグ文字列を作成する方法を示しています。

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

たとえば、次のクエリでは、以下のデバッグ文字列が生成されます。

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

スキーマ メタデータ

Microsoft.Data.Sqlite では、DbConnection の GetSchema メソッドは実装していません。 代わりに、sqlite_master テーブルと、table_infoforeign_key_list などの PRAGMA ステートメントを使用して、スキーマ情報のクエリを直接実行できます。

たとえば、次のクエリでは、データベース内のすべての列に関するメタデータが取得されます。

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

関連項目