Vb.net 再次使用ADODB连接后System.AccessViolationException异常

Vb.net 再次使用ADODB连接后System.AccessViolationException异常,vb.net,adodb,Vb.net,Adodb,在过去的两周里,我在为我的公司开发的vb.net应用程序中遇到了一个令人沮丧的错误 该应用程序由一个基本界面(Windows窗体应用程序)组成,用于获取一些数据(文件路径和坐标),然后处理来自外部应用程序Staad.Pro(在石油和天然气行业非常常见)中建模的钢结构和多个Excel文件的大量信息 因此,它从两个来源获取外部信息: 一个Staad.Pro文件,通过库openstaad.dll,与 斯塔德专业 一些Excel文件,通过ADO连接和记录集对象 该应用程序已令人满意地使用了三年。我最

在过去的两周里,我在为我的公司开发的vb.net应用程序中遇到了一个令人沮丧的错误

该应用程序由一个基本界面(Windows窗体应用程序)组成,用于获取一些数据(文件路径和坐标),然后处理来自外部应用程序Staad.Pro(在石油和天然气行业非常常见)中建模的钢结构和多个Excel文件的大量信息

因此,它从两个来源获取外部信息:

  • 一个Staad.Pro文件,通过库openstaad.dll,与 斯塔德专业
  • 一些Excel文件,通过ADO连接和记录集对象
该应用程序已令人满意地使用了三年。我最近做了一些更改,介绍了数据的后台处理过程,以及使用外部Excel文件为每个项目公司定义的配置,该文件以前是在代码级别定义的

此配置文件直接在Excel中读取,打开应用程序实例(Excel),而其他Excel文件则使用ADO打开,正如我前面所说的。同时,在单个文本文件中定义了配置文件路径,应用程序始终使用该路径读取该路径,可以使用应用程序通过
OpenFileDialog
对象修改该路径的内容

我特别指定这些点,因为它们是我在错误发生之前所做的更改。由于我的假期,也有两个星期没有活动,期间发布了一些Windows更新(我想其中一些与流行的勒索软件Wannacry和Petya有关)

因此,我在VS Community 2015中运行应用程序时收到的错误消息如下:

(new Thread(() => OpenExcel())).Start();
类型为“System.AccessViolationException”的未处理异常 发生在mscorlib.dll中

其他信息:试图读取或删除 写保护内存。这通常表示其他内存 腐败

当应用程序打开到Excel文件的第二个ADO连接时,会显示以下代码:

cnn1.Open("Provider=Microsoft.ace.OLEDB.12.0;" &
          "Data Source=" & rutaarchivo & ";" &
          "Extended Properties=""Excel 12.0;HDR=Yes"";")
第一个连接关闭,相应的对象设置为
Nothing
。我改变了访问该文件的方式,试图理解错误,避免了ADO,但在稍后使用ADO连接到另一个Excel文件时,再次出现错误,这也是更改后的第二个ADO连接

错误是随机产生的,当项目在VS Community 2015中刚刚打开,然后第一次运行时,不会出现错误(通常),但在第二次执行后会出现错误

其他情况下,在调用与Excel文件建立ADO连接的子例程时出现错误,而不是在子例程本身的代码处出现错误,并显示不同的消息:

托管调试助手“FatalExecutionEngineError”检测到 (路径)中的问题

其他信息:运行时遇到 致命的错误。错误地址位于线程上的0x79f387d1 0x168c。错误代码为0xc0000005。此错误可能是系统中的错误 CLR或用户代码中不安全或不可验证的部分。常见的 此错误的来源包括COM互操作或 PInvoke,这可能会损坏堆栈

在查找错误模式时,我发现了另一个错误,该错误在我第二次使用库openstaad.dll的同一类型对象时出现,并显示以下消息:

类型为“System.Runtime.InteropServices.COMException”的异常 发生在Microsoft.VisualBasic.dll中,但未在用户代码中处理 补充资料:estábloqueada备忘录。(普西翁除外) HRESULT:0x8002000D(显示阵列锁定))

我在互联网上找到了两篇关于此错误的主要文章(System.AccessViolationException):

我尝试重新安装Access数据库引擎,定义所提到的环境变量,并更改.NET Framework版本。什么都不管用

如能帮助解决此问题,我们将不胜感激


阿尔贝托·鲁伊斯(Alberto Ruiz)

在第二次使用Microsoft.ACE.OLEDB.12.0连接(本例中为MS Access)后,我最近遇到了相同的错误

对我有帮助的是用一条新的线把连接包起来。 例如:如果打开连接的问题代码位于方法
OpenExcel
中,则可以执行以下操作:

(new Thread(() => OpenExcel())).Start();

希望这有帮助。

您编写了“第一个连接已关闭,相应的对象设置为
Nothing
”-您不应该将其设置为
Nothing
,您应该在其上使用
.Dispose()
,以便正确清理。其次,对于使用Excel应用程序实例的部分:您好,安德鲁:我认为您不能处理ADODB连接。我按照本文中的说明从内存中释放连接对象。我对Excel没有问题。我使用API函数PostMessage关闭Excel进程。非常感谢您的回复。问题是,我现在遇到了ADODB问题,这些问题是由于我在应用程序中使用的代码没有更改而突然出现的,这些代码涉及ADODB连接。1)也许是时候更新代码以使用ADO.NET方法了,如中所建议的那样。2) 主线程和后台线程之间是否共享连接对象?我可以想象那可能会引起一个问题。