tl;dr
- Microsoft Access の .mdb / .accdb ファイルを読み取れる Rust 製のライブラリと CLI ツールを作りました
- pure Rust なので ODBC ドライバも C コンパイラも不要、macOS / Linux / Windows で動きます
- Access 97 (Jet3) から Access 2019 (ACE17) まで対応
- crates.io に公開済み、MIT / Apache-2.0 ライセンス
背景
諸事情で Access データベースの中身を扱う機会がありまして。
macOS や Linux で .mdb / .accdb ファイルを読む手段としては、C で書かれた mdbtools があります。なんと2000年3月が初版らしい、すごい歴史。
大抵のことはこれでどうにはなるんですが、今回やりたかったのは Tauri アプリからライブラリとして呼び出したい状況があって、せっかくのマルチプラットフォームなのだから、C の FFI を介さずに Rust からネイティブに使いたいよね的な感じが少しありました。
で、ついでなんでCLIつけるよね、既存のソフトウェアをRustで書く例もよく見かけるし、みたいな。
「手元に .mdb ファイルがあるけど中身を確認したい」というとき(滅多にないシチュエーション)、Access がなくても、Windows でなくてもこれだけでいけるはず的なやつです。
ちょっと困ったこと
mdbtoolsをそのまま移植すればいいかーと思ったんですけど、ライセンスがGPLv2なのでそれを継承するとTauriアプリに組み込むときに困るので、スクラッチで作ることになりました。
Java 製の Jackcess がApache Licenseなので、それを中心に扱い、mdbtools の HACKING.md も参照しつつ進める的な感じですかね。
できること
- データベースエンジンのバージョン判定
- テーブル一覧の表示
- テーブルスキーマ(カラム、インデックス、リレーションシップ)の表示
- テーブルデータの CSV エクスポート
- DDL 生成(SQLite / PostgreSQL / MySQL / Access SQL)
- 保存済みクエリの SQL 復元
- オブジェクトプロパティの表示
- VBA ソースコードの抽出
- パスワード保護されたファイルの読み取り(RC4 / Agile Encryption)
これらの機能はAccess 97 から Access 2019 まで対応しているはずです、たぶん。
とくちょう
- pure Rustなんで、ほとんどどこでも動くはずです。ビルドも簡単のはず!
- MacOS / Linux / Windows のビルド済みバイナリも提供しています
- DDLを生成するので他のDBに移植しやすい
- SQLite / PostgreSQL / MySQL / Access 用に対応しています
- VBA ソースコードの抽出ができます!
- パスワード保護された .mdb / .accdb ファイルも読めます
VBA ソースコードの抽出について
すでにmdbtoolsとかJackcessという既存アプリケーションとの差別化要素として、両ツールができないVBAの抽出(標準モジュール、クラスモジュール、フォームモジュール)に対応しています。
とは言っても、OLE2なオブジェクトまでは取得できてるので、すでに十分な実績がある cfbとovbaというクレートを普通に使ってCFB(Compound File Binary)コンテナをパースしただけなんですけどね。
それでも一応独自機能!
こういう感じ。
$ jetdb vba list vbaTest.mdb
Class1 Form_Form1 Module1
$ jetdb vba show vbaTest.mdb Module1
Attribute VB_Name = "Module1"
Option Compare Database
Option Explicit
Public Function Hello() As String
Hello = "Hello, World!"
End Function
パスワード保護されたファイルの読み取りについて
こちらも既存ツールとの差別化ポイント。.accdb で使われている Agile Encryption(AES-CBC + SHA-512 鍵導出)によるパスワード保護に対応しています。mdbtools も Jackcess 本体もこの暗号化には対応しておらず、Jackcess は別プラグイン(Jackcess Encrypt)が必要です。
--password オプションを渡すだけ。
$ jetdb tables --password secret encrypted.accdb Table1 Table2 Table3
パスワードなしでアクセスしようとするとちゃんと怒られます。
$ jetdb tables encrypted.accdb jetdb: password required
ちなみに古い .mdb のパスワード保護は実質飾りで、データ自体は暗号化されていないので誰でも読めます。
CLI ツールとしての使い方
インストール
cargo install jetdb-cli
基本的な使い方
# エンジンバージョンを確認 $ jetdb ver database.mdb JET4
みたいな感じのサブコマンド方式。
jetdbだけでhelpが表示されるし、README.ja.mdにも書いてあります!
ライブラリとしての使い方
CLI はライブラリの機能をそのまま公開しているので、CLI でできることは全部できます。
Rust のプロジェクトに組み込む場合:
[dependencies] jetdb = "0.2"
詳しくはREADME.ja.mdかlib.ja.mdをみていただけると!
英語ならdocs.rsにライブラリドキュメントみたいなやつが公開されています。
Tauri アプリに組み込む場合も Cargo.toml に依存を追加するだけなので、FFI 関係なく動きます。
対応バージョン
| エンジン | Access バージョン | ファイル形式 |
|---|---|---|
| Jet3 | Access 97 | .mdb |
| Jet4 | Access 2000/2003 | .mdb |
| ACE12 | Access 2007 | .accdb |
| ACE14 | Access 2010 | .accdb |
| ACE15 | Access 2013 | .accdb |
| ACE16 | Access 2016 | .accdb |
| ACE17 | Access 2019 | .accdb |
たぶん、現状で流通してるものは大抵いけると思う。Jet3のVBA抽出はテストされてないかもしれないので、ファイル持ってるひといたらください。 あと、Microsoft Moneyで使われていたMSISAM形式というのがほぼJetぽいんですけど、ファイルもないし対応はしていません。 Jackcessかmdb-readerなら多分読めるはずですので、そちらに頼ってください。ほぼないシチュエーションだと思うけど。
制限事項
- 読み取り専用(書き込みには対応していない)
- テーブルの全行をメモリに読み込むため、行数が非常に多いテーブルではメモリ使用量に注意
かんそう
コードは約 18,000 行、テストは 720 超。テストデータとして Jackcess から引用した 95 個の実際の .mdb / .accdb ファイルを使っています。
今回も全部Claude Code CLIが書いてくれました。ありがとうClaude Code。ありがとうOpus 4.6。
全体的に素直に解釈できるような構成にしたつもりで、特別な工夫はあんまりないはず。 バイナリファイルを読んでパースするだけなんだし、先達の資料(HACKING.md)と、Jackcessの既存実装を参考にいろいろ頑張ってくれたはず、Claude Codeが。
なので、やろうと思うってからおそらく実稼働時間16-20時間くらい、期間としても5日くらいのはずです。すごいぞ、Claude Code。 全体のレビューとか詳細な分析とかはちょっとCodexを使いました。(その後暗号化ファイル対応とかしてのでもう少しかかりました。)
いちおうむちゃくちゃニッチなツールだけど、わりと大きめな名前取れたし、初めてCratesとして公開できたので、だいぶ良かったです。生成AI NGとかじゃなければ多分使えると思う。
リンク
- GitHub: https://github.com/dominion525/jetdb
- ライブラリ:
- crates.io: https://crates.io/crates/jetdb
- docs.rs: https://docs.rs/jetdb/latest/jetdb/
- CLI
- crates.io: https://crates.io/crates/jetdb-cli
機能比較表
Microsoft Access データベースツール比較表です。
調査日: 2026-02-19
| jetdb | MDB Tools | Jackcess | mdb-reader | access-parser | pyaccdb | MMKiwi.MdbReader | |
|---|---|---|---|---|---|---|---|
| 基本情報 | |||||||
| 言語 | Rust | C | Java | JS/TS | Python | Python | C#/.NET |
| バージョン | 0.2.1 | 1.0.1 | 4.0.10 | 3.2.0 | 0.0.6 | — | 0.1.0β |
| ライセンス | MIT/Apache-2.0 | LGPL/GPL | Apache 2.0 | MIT | Apache 2.0 | AGPL v3 | MIT |
| 最終更新 | 2026-02 | 2025-01 | 2025-10 | 2026-02 | 2025-01 | 2025-11 | 2024-07 |
| 対応バージョン | |||||||
| Jet3 (Access 97) | ○ | ○ | × | ○ | ○ | × | ○ |
| Jet4 (Access 2000) | ○ | ○ | ○ | ○ | ○ | × | ○ |
| Jet4 (Access 2003) | ○ | ○ | ○ | ○ | ○ | × | ○ |
| ACE12 (Access 2007) | ○ | × | ○ | ○ | △ | ○ | △ |
| ACE14 (Access 2010) | ○ | × | ○ | ○ | △ | ○ | △ |
| ACE16 (Access 2016) | ○ | × | ○ | ○ | △ | ○ | △ |
| ACE17 (Access 2019) | ○ | × | ○ | ○ | △ | ○ | △ |
| 機能比較 | |||||||
| テーブル読み取り | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
| クエリ定義読み取り | ○ | ○ | ○ | × | × | × | × |
| リレーションシップ | ○ | × | ○ | × | × | × | × |
| オブジェクトプロパティ | ○ | × | ○ | △ | × | × | × |
| VBA モジュール抽出 | ○ | × | × | × | × | × | × |
| DDL 生成 | ○ | ○ | × | × | × | × | × |
| 書き込み | × | × | ○ | × | × | × | × |
| DateTimeExtended | ○ | × | ○ | ○ | × | × | × |
| Complex Column ※2 | △ | × | ○ | ○ | × | × | × |
| 暗号化対応 | |||||||
| Jet (レガシー) | ○ | ○ | △ ※1 | ○ | × | × | × |
| RC4 CryptoAPI | ○ | × | △ ※1 | ○ | × | × | × |
| Standard AES (ECB) | ○ | × | △ ※1 | × | × | × | × |
| Agile AES | ○ | × | △ ※1 | ○ | × | ○ | × |
| DDL 方言内訳 | |||||||
| SQLite | ○ | ○ | — | — | — | — | — |
| PostgreSQL | ○ | ○ | — | — | — | — | — |
| MySQL | ○ | ○ | — | — | — | — | — |
| Access SQL | ○ | ○ | — | — | — | — | — |
| Oracle | × | ○ | — | — | — | — | — |
| Sybase | × | ○ | — | — | — | — | — |
凡例: ○ 対応 △ 部分対応/条件付き × 非対応 — 該当なし
- ※1 Jackcess 本体は暗号化非対応。Jackcess Encrypt 拡張ライブラリ(別途導入)で対応。
- ※2 Attachment / Multi-Value / Versioned Memo。ACE 形式(Access 2007+)固有。jetdb は参照IDの取得のみ(実データ未展開)。Jackcess は読み取り対応(テーブル新規作成は不可)。
補足:
- MDB Tools は Jet3/Jet4(.mdb)のみ対応。ACE 形式(.accdb)は非対応
- Jackcess は Access 97(Jet3)非対応。Access 2000 以降の読み書きに対応
- mdb-reader v3.2.0 で Attachment カラム対応を追加
- pyaccdb は .accdb 形式のみ対応(.mdb 非対応)。暗号化は Agile のみ
- access-parser は .accdb 対応を謳うがテスト範囲が限定的
- MMKiwi.MdbReader はプレアルファ段階。本番利用は非推奨
- jetdb v0.2.1 で RC4 CryptoAPI、Standard AES、NonStandard AES 暗号化と DateTimeExtended カラム型を追加