Access DAO 为 Access 97 文件引发 COMException

Posted

技术标签:

【中文标题】Access DAO 为 Access 97 文件引发 COMException【英文标题】:Access DAO throws COMException for Access 97 files 【发布时间】:2021-02-20 18:59:53 【问题描述】:

我们使用 Microsoft.Office.Interop.Access.Dao(版本 15.0.0.0)库来访问 Microsoft Access 文件中的信息,因为它允许我们实现其他库所缺乏的一些功能(例如重新链接数据库表的能力) )。 这对所有类型的 Access 文件都非常有效,除了 Access 97 .mdb 文件。调用 OpenDatabase 方法时,我们会定期收到异常。

var engine = new DBEngine(); 
var db = engine.OpenDatabase(path);

它会定期抛出 COMException

类型:System.Runtime.InteropServices.COMException

消息:无法打开使用以前版本的 你的申请。

堆栈跟踪:在 Microsoft.Office.Interop.Access.Dao.DBEngineClass.OpenDatabase(字符串 名称、对象选项、对象只读、对象连接)

我尝试指定DefaultType,但结果是一样的

engine.DefaultType = (int)WorkspaceTypeEnum.dbUseJet;

我认为这个库的版本不支持 Access 97 文件,但有时它会处理文件。即使它失败了,打开同一组文件的第二次尝试几乎总是成功的。所以我想知道这些不一致是否有具体原因,是否有人有解决这些问题的经验。

【问题讨论】:

【参考方案1】:

Access 数据库引擎 (ACE) 组件(例如 ACEDAO.DLL)的 15.x 版本对应于 Access_2013,并且 Access_2013完全放弃了对 Access_97 文件格式的支持。如果OpenDatabase 有时有效,有时会抛出

无法打开使用以前版本的应用程序创建的数据库。

那么前者只是侥幸。 (在尝试禁用 Access_97 格式时,开发人员显然错过了一两个代码路径。)

TL;DR – 不要指望能够将 Access_97 文件与 Access_2013+ 一起使用。将 Access_97 文件转换为您的 Access 版本支持的格式。

【讨论】:

我不想有这样的“侥幸”,至少知道它真的无法处理 Access 97 文件:) 不幸的是,我无法转换文件,因为这些是文件用户上传,我们无权更改其文件格式或要求他们更改文件。我认为唯一适用的方法是对 Access 97 文件使用旧 DAO(3.51 或 3.6)库,并根据文件类型在旧 DAO 和 15.x 之间动态选择方法... “我认为唯一适用的方法是对 Access 97 文件使用旧的 DAO(3.51 或 3.6)库……” - 是的,这可能是您所希望的最好的方法。

以上是关于Access DAO 为 Access 97 文件引发 COMException的主要内容,如果未能解决你的问题,请参考以下文章

将 Access 数据库转换为 97 格式

使用 Access 2003 将 Access 2000 数据库转换为 Access 97

我需要编写一个 Access 97 .mdb 文件

Access 97中如何使用VBA浏览文件?

ACCESS问题

将 MS Access 97 转换为 MySQL 5.5(有任何工具吗?)