C#でデータベースのフィールド名リストを取得する

C#でデータベースに接続する方法はいくつかありますが、OleDbConnectionクラスやSqlConnectionクラスなどの DbConnectionクラスから派生したクラスを利用する事が多いかと思います。

 

DbConnectionクラスを使うと各テーブルのフィールド名の一覧を取得する事が可能です。

 

ここでは、DbConnectionクラスを使ってフィールド名の一覧を取得する方法について解説します。


DbConnectionクラスのGetSchemaメソッド

DbConnectionクラスの GetSchemaメソッドを使えばテーブル名の一覧が取得できます。

GetSchemaメソッドは様々なスキーマ情報を取得する事ができるメソッドですが、第1引数に「Columns」を指定する事でテーブル名のリストを取得する事ができます。

 

結果は DataTableオブジェクトとして取得できます。

TABLE_NAME」というカラム名にテーブル名が、

COLUMN_NAME」というカラム名にフィールド名が格納されています。

 

以下の例では、Microsoft Accessのデータベースを開きフィールド名の一覧を出力しています。

var builder = new System.Data.OleDb.OleDbConnectionStringBuilder();
builder["Provider"] = "Microsoft.ACE.OLEDB.12.0";
builder["Data Source"] = "C:\\Sample.accdb";
builder["Jet OLEDB:Database Password"] = "acbdefg";

using (var conn = new System.Data.OleDb.OleDbConnection(builder.ConnectionString))
{
    conn.Open();
    var dt = conn.GetSchema("Columns");
    foreach (DataRow row in dt.Rows)
    {
        var tableName = row["TABLE_NAME"].ToString();
        var fieldName = row["COLUMN_NAME"].ToString();
        var text = string.Format("{0}.{1}", tableName, fieldName);
        Console.WriteLine(text);
    }
    conn.Close();
}

※Accessの場合「MSys」で始まるシステムオブジェクトも含まれます


指定のテーブルのフィールド名のみを取得する

上記の例では、全テーブルのフィールド名が取得されます。

GetSchemaメソッドでは第2引数を使って、指定したテーブルのフィールド名のみを取得する事も可能です。

 

第2引数は string型の配列で指定しますが、GetSchemaメソッドの結果で得られるDataTableオブジェクトのカラムと対応します。

OleDBの場合、3番目のカラムが「TABLE_NAME」となるので、配列の3番目に取得したいテーブル名を設定します。

 

各DB毎のスキーマについては下記を参照してください。

以下の例では、「TestTable」テーブルのフィールド名のみを出力しています。

var builder = new System.Data.OleDb.OleDbConnectionStringBuilder();
builder["Provider"] = "Microsoft.ACE.OLEDB.12.0";
builder["Data Source"] = "C:\\Sample.accdb";
builder["Jet OLEDB:Database Password"] = "acbdefg";

using (var conn = new System.Data.OleDb.OleDbConnection(builder.ConnectionString))
{
    conn.Open();
    var restriction = new string[3];
    restriction[0] = null;
    restriction[1] = null;
    restriction[2] = "TestTable";

    var dt = conn.GetSchema("Columns", restriction);
    foreach (DataRow row in dt.Rows)
    {
        var tableName = row["TABLE_NAME"].ToString();
        var fieldName = row["COLUMN_NAME"].ToString();
        var text = string.Format("{0}.{1}", tableName, fieldName);
        Console.WriteLine(text);
    }
    conn.Close();
}