sh1’s diary

プログラミング、読んだ本、資格試験、ゲームとか私を記録するところ

C# による mdb 形式 ファイルの使い方・調べ方

(.mdb) 形式は、マイクロソフト Access でその昔に標準だったファイル形式です。

2007 年以降は新しいデータ形式の accdb 形式のファイルになったので、今は非推奨の形式となっています……が、保守などの関係で触れる機会があったので、その使い方・調べ方を記録した記事です。

追記(2023年2月10日):.NET は windows のみではない、いくつかのプラットフォームをサポートする言語になったことで、OleDb は windows をサポートする機能であるため、新しい警告が表示されるようになりました。以下に追加しています。

OLEDB で mdb データベースに接続する

public IEnumerable<Charactor> Select()
{
    var connection = new OleDbConnection();
    var command = new OleDbCommand();

    var source = @"DB\Charactors.mdb";
    connection.ConnectionString = $@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={source}";

    connection.Open();

    command.CommandText = "SELECT * FROM サンプルテーブル";
    command.Connection = connection;

    var reader = command.ExecuteReader();
    var charactors = new List<Charactor>();

    while (reader.Read())
    {
        var chara = new Charactor();

        chara.Id = (int)reader[0];
        chara.Name = !reader.IsDBNull(1) ? (string)reader[1] : "";
        chara.Hp = !reader.IsDBNull(2) ? (int?)reader[2] : null;
        chara.Mp = !reader.IsDBNull(3) ? (int?)reader[3] : null;
        chara.IsDead = (bool)reader[4];

        charactors.Add(chara);
    }

    return charactors;
}

OLE DB (Object Linking and Embedding, Database) に接続するプロバイダーの選択は、次のとおり。

ACE はそれぞれ 12 = Access 2007, 2010, 15 = 2013, 16 = 2016 のようになっています。

この選択の面倒は1つ目の Jet.4.0 は、ビルドの対象プラットフォームを 32bit (x86) に指定しなければ使用することができません。後者の ACE.1X.0 は Access をインストールするか、「Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント」をインストールしなければ利用することができません。1

32bit と 64bit のプロバイダーを並行インストールすることは、一切サポートされていないです。

接続プロバイダーの選好は、次の Microsoft の解説があるため原則的には自由です。(先述のとおり x86 制限 or コンポーネントインストールの選択になる)

ACE エンジンは、以前のバージョンの JET エンジンとの完全な下位互換性があるので、以前のバージョンの Access から (.mdb) ファイルを読み書きできます。

Microsoft Docs - Microsoft Access 2010 を使用したデータ プログラミング

私の意見を加えると mdb 形式のファイルが古い場合、ACE の互換性が完全ではない場合もあるように思います。

mdb ファイル自体を調べていくとき、OLE DB 接続は、DB 全般を対象にした汎用的な DB 接続なので JET DB に関する詳細なプロパティを参照することができません。なので、下記のとおり JET DB の情報を取得するためには専用のデータベース接続で情報を獲得していきます。


調べることは?

mdb 形式は「どの Access で作成されたのか」と「利用できる(推奨される) DB エンジンは何か」を調べることになります。この情報を整理した表が次です。 2

クライアント DB エンジン(Jet OLEDB) 推奨 DB 形式
Access 2.0 Jet 2.0(3) *.mdb (Jet 2.0)
Access 95 Jet 3.0(4) *.mdb (Jet 3.x)
Access 97 Jet 3.5(4) *.mdb (Jet 3.x)
Access 2000 Jet 4.0(5) *.mdb (Jet 4.x)
Access 2002 Jet 4.0(5) *.mdb (Jet 4.x)
Access 2003 Jet 4.0(5) *.mdb (Jet 4.x)
DAO 3.0 Jet 3.0(4) *.mdb (Jet 3.x)
DAO 3.5 Jet 3.5(4) *.mdb (Jet 3.x)
DA0 3.6 Jet 4.0(5) *.mdb (Jet 4.x)
Microsoft.Jet.OLEDB.3.51 Jet 3.5(4) *.mdb (Jet 3.x)
Microsoft.Jet.OLEDB.4.0 Jet 4.0(5) *.mdb (Jet 4.x)


DB タイプの確認について

public string GetEngineType()
{
    var connection = new ADODB.Connection();
    var source = @"DB\Charactors.mdb";

    // 接続設定
    connection.ConnectionString = $@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={source}";
    connection.Open();

    ADODB.Property prop = connection.Properties["Jet OLEDB:Engine Type"];

    return prop?.Value.ToString() ?? "-1";
}

ADODB を利用するためには COM の参照の追加が必要です。

ADO の参照を追加

下記のサンプルの場合は、「4」の値が返却されました。よって、DB エンジンで推奨なのは JET 3.X である可能性が高くなりました。

現在 ADO の利用は推奨されません。なので、バージョンを調べる程度の利用に留めておきましょう。

ファイルを作成した Access を調べる

public string GetAccessVersion()
{
    var engine = new DAO.DBEngine();
    var source = @"DB\Charactors.mdb";

    var db = engine.OpenDatabase(source);
    var props = db.Properties;

    var versionText = props["AccessVersion"].Value.ToString();

    return versionText;
}

下記の表にあわせた識別例は「Gist」に掲載。

ファイルを作成した Access を調べるためには、今度は DAO を参照に追加します。

DAO の参照を追加

アクセスのバージョンを表すテキストをどう読むのかも、調べる必要があります。次に示すとおりです。 3

バージョン AccessVersion ProjVer
Access 2.0 02.XX
Access 7.0 (Access 95) 06.XX
Access 97 07.XX
Access 2000 08.XX
Access 2002 08.XX or 09.XX 24
Access 2003 08.XX or 09.XX 35

Access 2003 のつぎは Access 2007 ですが、ここから新しいデータベースファイル形式の .accdb に対応しているので、基本的にはここまでが対象です。

Access 2000 からは AccessVersion の値が同じであるため、プラスして ProjVer を読み取り、分類する方法が一般的のようです。 4

状況補足は wiki から次のとおり。

サンプル

mdb ファイルと接続するサンプルを公開しておきます。「MdbTest」です。

実行例

参考


  1. Microsoft Access Database Engine 2016 Redistributable もあります
  2. 整理された情報が無いため DAOJet OLEDB から作成した表。
  3. この表も個人のサイトを参考にするしかなさそうです。
  4. ただし、ProjVer は必ず生成されるわけではないと指摘するコメントもある。
  5. The most significant transition was from the Access 97 to the Access 2000 format; which is not backward compatible with earlier versions of Access. (URL)