【问题标题】:OpenCurrentDatabase generates System.AccessViolationExceptionOpenCurrentDatabase 生成 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 一起使用。

标签: c# wpf ms-access com-interop office-automation


【解决方案1】:

Access_2013 不再支持 Access_97 文件格式。有人报告说,Access_2016 更加坚持与 Access_97 文件完全无关

This question 更详细地讨论了这个问题。 TL;DR:需要同时支持 Access_2016 和 Access_97 的业务应用程序是

  • 显然不是官方支持的配置,并且
  • 如果它可以正常工作,可能会成为持续头痛的根源。

我的建议:咬紧牙关,远离 Access_97 文件格式。

【讨论】:

  • 我别无选择,只能使用 Access97,因为第三方软件需要解决这个问题。供应商坚持它必须是 Access97,他们不会更新他们的代码以适用于更新的版本
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-24
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多