(.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) に接続するプロバイダーの選択は、次のとおり。
- Provider=Microsoft.Jet.OLEDB.4.0;
- Provider=Microsoft.ACE.OLEDB.12.0;
- Provider=Microsoft.ACE.OLEDB.15.0;
- Provider=Microsoft.ACE.OLEDB.16.0;
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 の参照の追加が必要です。
下記のサンプルの場合は、「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 を参照に追加します。
- Microsoft DAO 3.6 Object Library
アクセスのバージョンを表すテキストをどう読むのかも、調べる必要があります。次に示すとおりです。 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 から次のとおり。
- Access 95 で ActiveX コントロール (DAO) の追加
- Access 2000 で JET 以外のデータベース連携強化
- Access 2000 で ActiveX Data Object (ADO) の追加
- Access 2000 で文字コードが shift-jis から Unicode にデフォルトが変更
- Access 2000 形式から Access 97 形式への下位互換性が無い 5
サンプル
mdb ファイルと接続するサンプルを公開しておきます。「MdbTest」です。
参考
- Microsoft Access Database Engine 2016 Redistributable もあります↩
- 整理された情報が無いため DAO と Jet OLEDB から作成した表。↩
- この表も個人のサイトを参考にするしかなさそうです。↩
- ただし、ProjVer は必ず生成されるわけではないと指摘するコメントもある。↩
- 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)↩