OpenCurrentDatabase 生成 System.AccessViolationException
Posted
技术标签:
【中文标题】OpenCurrentDatabase 生成 System.AccessViolationException【英文标题】:OpenCurrentDatabase generates System.AccessViolationException 【发布时间】:2018-04-30 18:45:40 【问题描述】:我有一个需要自动创建 Access 2016 数据库的 C# WPF 应用程序。
它执行以下代码:
try
var tempDb = new Access.Application();
tempDb.OpenCurrentDatabase(tempDbPathFile);
在 OpenCurrentDatabase 的行上引发了以下异常:
System.AccessViolationException 发生 HResult=0x80004003 Message=试图读取或写入受保护的内存。这通常是一个 指示其他内存已损坏。 Source=Microsoft.Office.Interop.Access StackTrace:在 Microsoft.Office.Interop.Access.ApplicationClass.OpenCurrentDatabase(字符串 文件路径,布尔独占,字符串 bstrPassword)在 AccessLauncher.WPF.Launcher.ExportFormsAndQueries(字符串 tempDbPathFile, String userDbPathFile)
我没有将互操作用于 Access97 - 仅用于 Access2016。应用程序必须与 97 进行的唯一交互是将现有的空 97 数据库复制到本地文件夹,然后通过 OleDbCommand 从 Sql Server 中选择来填充它。
我在几台 PC 上尝试了相同的代码,但我只在安装了 Access2016 和 Access97 的 PC 上收到错误。不幸的是,这是一项要求,因为应用程序必须能够以两种格式创建不同的数据库——用户随后打开(在 Access97 或 Access2016 中视情况而定)以进行编辑。
有什么办法可以解决这个问题吗?
【问题讨论】:
可能是 DLL 地狱,还有 32 位/64 位互操作的额外好处。 Access 97 中的 97 是 1997 年,也就是 20 多年前 你确定需要支持吗:-) --> maybe related,尤其是其接受答案中的连接字符串详细信息 是的,恐怕该应用程序需要与 Access97 一起使用 - 即使它比我想要的要旧。 您是否正在为 Access 97 使用互操作程序集???通常,您会为需要支持的最早版本使用 PIA,并且它“正常工作”。我预计 2010 年运行的 2016 年 PIA 会出现问题,更不用说 97 年了。 我没有将互操作用于 Access97 - 仅用于 Access2016。应用程序必须与 97 进行的唯一交互是将现有的“空”97 数据库复制到本地文件夹,然后通过 OleDbCommand 从 Sql Server 中选择来填充它 我会尝试从 Access97 生成一个互操作程序集(假设这是可能的?),并针对 that 编写代码。 IMO Access97 互操作库更可能与 Access 2016 一起使用,而不是看到 Access 2016 互操作与 Access97 一起使用。 【参考方案1】:Access_2013 不再支持 Access_97 文件格式。有人报告说,Access_2016 更加坚持与 Access_97 文件完全无关。
This question 更详细地讨论了这个问题。 TL;DR:需要同时支持 Access_2016 和 Access_97 的业务应用程序是
显然不是官方支持的配置,并且 如果它可以正常工作,可能会成为持续头痛的根源。我的建议:咬紧牙关,远离 Access_97 文件格式。
【讨论】:
我别无选择,只能使用 Access97,因为第三方软件需要解决这个问题。供应商坚持它必须是 Access97,他们不会更新他们的代码以适用于更新的版本以上是关于OpenCurrentDatabase 生成 System.AccessViolationException的主要内容,如果未能解决你的问题,请参考以下文章