如何获取MS Access版本及MDB/ACCDB文件创建版本?ODBC场景问询
首先直接给结论:没有任何SQL查询语句能直接获取MDB/ACCDB文件的创建版本——Access的系统表(包括MSysObjects这类核心系统表)里根本没存储这个信息。不过你有其他几种可靠的方式来拿到这个版本,完全适配你的C++/ODBC开发场景:
1. 直接读取文件头(最准确的方式)
这是获取原始创建版本最靠谱的方法,版本信息直接编码在文件的前几个字节里,不需要打开数据库,性能也极高:
针对MDB文件:
文件头偏移0x03-0x04的字节是版本标识:
0x00000400→ Access 970x00000600→ Access 2000/2002/2003(这几个版本的MDB格式完全兼容)
你在C++里直接打开文件,读取这两个字节就能快速判断。
针对ACCDB文件:
ACCDB的前8字节是固定签名0x01 CD AB DD E0 00 00 00,偏移0x14-0x17的字节存储了版本号:
0x0000000C→ Access 2007(版本12)0x0000000E→ Access 2010(版本14)0x00000010→ Access 2013/2016/2019/365(版本16,这些版本的ACCDB格式基本兼容)
2. 通过ODBC间接获取(引擎版本参考)
虽然没法拿到创建版本,但你可以通过ODBC API的SQLGetInfo函数获取当前连接使用的Access引擎版本,这能帮你推断文件的兼容版本:
在C++里,建立ODBC连接后可以这样调用:
SQLCHAR verBuffer[256]; SQLSMALLINT verLen; SQLGetInfo(hdbc, SQL_DBMS_VER, verBuffer, sizeof(verBuffer), &verLen);
返回的版本字符串对应关系:
12.0→ Access 2007引擎14.0→ Access 2010引擎16.0→ Access 2013+引擎
注意:这个返回的是当前驱动使用的引擎版本,不是文件的创建版本——比如一个Access 2007创建的ACCDB,用2019的引擎打开,返回的是16.0。但如果文件能被某个版本的引擎打开,至少说明它的版本不高于该引擎版本。
3. 借助COM对象(可选,若允许依赖Access组件)
如果你的程序可以依赖Access的COM组件(比如DAO或OLEDB),可以打开数据库后获取引擎版本,但同样这是运行时引擎版本,不是创建版本:
比如用DAO的话,C++里可以调用DBEngine->Version属性,返回的字符串和ODBC的SQL_DBMS_VER类似。但这种方法需要用户机器上安装了Access组件,不如文件头方法通用。
总结一下:SQL层面确实拿不到创建版本,直接读文件头是最直接、准确且不依赖外部组件的方式,非常适合你的C++程序场景。
内容的提问来源于stack exchange,提问作者Igor

