[C#] [mdb] C#でmdbのテーブル定義情報を取得、及びカラム単位のデータ型などを取得

バージョン

C# 8.0

概要

C#でテーブルのスキーマ情報を取得し、そのスキーマ情報に格納されているカラム単位でのデータ型やNULL許容制約などの状態を取得する。

コード

string tableName = "PersonInfo";  // 取得したいテーブル名

string[] restrictions = new string[4];
restrictions[2] = tableName;
// 対象テーブルのスキーマ情報を取得
var dt = con.GetSchema("Columns", restrictions);  // conはOleDbConnectionで事前にOpenしていること

// カラムは先頭から順に格納されている保証がないので注意
foreach (var row in dt.Rows.Cast<DataRow>())
{
    // カラム名
    var colmnname = row["column_name"].ToString();
    // データ型
    var dattype = (System.Data.OleDb.OleDbType)row["data_type"];  // OleDbTypeのenum
    var dattypeint = (int)row["data_type"];  // コード
    // NULL許容
    var nullable = (bool)row["is_nullable"];

    Console.WriteLine("col:" + colmnname + "  datatype:" + dattype.ToString() + "(" + dattypeint.ToString() + ")" +
         "  nullable:" + nullable.ToString());
}

上記コードforeachにあるrowのrow.ItemArrayにカラム情報が格納されているがobject[28]の配列になっており
row.ItemArray[0]にはどのようなデータが入っているかなどが判り難い。
Visual Studioデバッグできるならクイックウォッチでrow.Tableを展開すれば使える要素名、値がわかり、
row["data_type"]のようにして値を取得できる。
指定できる要素名の代表的なものを以下に記載する。

要素名 内容
TABLE_NAME テーブル名
COLUMN_NAME カラム名
IS_NULLABLE NULL許容
DATA_TYPE データ型(※1)

※1・・・データ型はintでコードが格納されている。System.Data.OleDb.OleDbTypeのenumを参照。

各要素についてはOLE DB スキーマコレクションを参考に。(以下サイトの「列」が該当部分)

docs.microsoft.com