【发布时间】: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