A Rust library and CLI tool for reading Microsoft Access database files (.mdb / .accdb).
Written in pure Rust with no C/C++ dependencies or FFI, so it works out of the box on macOS, Windows, and Linux. Supports Access 97 (Jet3) through Access 2019 (ACE17).
cargo install jetdb-cli[dependencies]
jetdb = "0.2"# Open a password-protected .accdb file
jetdb --password secret tables protected.accdb
# Show the database engine version
jetdb ver database.mdb
# List tables
jetdb tables database.mdb
# Show table schema (columns, indexes, relationships)
jetdb schema database.mdb
jetdb schema database.mdb -T Table1
# Generate DDL (SQLite / PostgreSQL / MySQL / Access)
jetdb schema database.mdb --ddl sqlite
# Export table data as CSV
jetdb export database.mdb Table1
# List saved queries / show SQL
jetdb queries list database.mdb
jetdb queries show database.mdb SelectQuery
# List VBA modules / show source code
jetdb vba list database.mdb
jetdb vba show database.mdb Module1
# Show object properties
jetdb prop database.mdb Table1See docs/cli.md for detailed options and output examples.
use jetdb::{PageReader, read_catalog, read_table_def, read_table_rows};
fn main() -> Result<(), jetdb::FileError> {
let mut reader = PageReader::open("database.mdb")?;
// List tables
let catalog = read_catalog(&mut reader)?;
for entry in &catalog {
println!("{}", entry.name);
}
// Read table definition
let entry = &catalog[0];
let table_def = read_table_def(&mut reader, &entry.name, entry.table_page)?;
// Read row data
let result = read_table_rows(&mut reader, &table_def)?;
for row in &result.rows {
println!("{:?}", row);
}
Ok(())
}For detailed API documentation and more examples, run cargo doc --open or see docs.rs/jetdb.
| Engine | Access Version | File Format |
|---|---|---|
| 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 |
- Read table metadata (columns, indexes, relationships)
- Read row data with Rust type mapping (Text, Long, Double, Timestamp, Money, Memo, OLE, GUID, etc.)
- Generate DDL for SQLite, PostgreSQL, MySQL, and Access SQL
- Recover SQL from saved queries
- Extract VBA module source code
- Read object properties (LvProp)
- Decrypt RC4-encrypted databases and password-protected .accdb files (Agile, RC4 CryptoAPI, Standard/NonStandard AES)
- Handle Jet3 (Latin-1) and Jet4+ (UTF-16LE, compressed text) encodings
- Read-only (no write support)
- No index-based lookups (full table scan only)
- Loads all rows into memory; be mindful of memory usage with very large tables
- Password-protected .accdb files require
PageReader::open_with_password(Agile, RC4 CryptoAPI, Standard/NonStandard AES) - Replication databases (.mda) are untested
- mdbtools — HACKING.md was an invaluable reference for understanding the MDB/ACCDB file format
- Jackcess (Apache License 2.0) — most test .mdb/.accdb files are sourced from this project (some were created independently). See testdata/SOURCES.md for details.
- jackcessencrypt (Apache License 2.0) — encryption-related test files are sourced from this Jackcess plugin
- MS-OFFCRYPTO — Microsoft's specification for Office document encryption, used as a reference for implementing encryption support
MIT OR Apache-2.0