第二次使用ADODB连接后发生System.AccessViolationException

问题描述:

我在为我公司开发的应用程序的最近两周中遇到了令人沮丧的错误。第二次使用ADODB连接后发生System.AccessViolationException

应用程序由基本接口(Windows窗体应用程序),以获得一些数据(文件路径及坐标),然后处理了很多从所谓Staad.Pro外部应用程序建模的钢结构即将到来的信息(非常普遍在石油&燃气部门)和几个Excel文件。

所以它从两个来源外部信息:

  • 一个Staad.Pro文件,通过图书馆openstaad.dll,与 Staad.Pro分布。
  • 一些Excel文件,通过ADO连接记录集对象。

该应用程序已使用满意三年。我最近做了一些修改,介绍数据的后台进程以及使用外部Excel文件为每个项目公司配置的定义,该文件以前在代码级定义。

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

我特别指定了这些点,因为它们是我在发生错误之前所做的更改。由于我的假期,还有两周没有进行任何活动,在此期间,一些Windows更新已经发布(我想其中一些涉及流行的勒索软件WannacryPetya)。

,所以我得到运行在VS 2015年社区应用程序中的错误消息如下:

类型的未处理的异常“System.AccessViolationException” mscorlib.dll中发生。

附加信息:试图阅读或 写保护内存。这通常表示其他内存 已损坏。

当应用程序打开第二ADO connectionn到Excel用下面的代码文件似乎:

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中打开,然后第一次运行时,通常不会出现错误,但会在第二次执行后出现错误。

其他时间错误出现在调用,使ADO连接到Excel文件,而不是在子程序本身的代码的子程序,用不同的信息:

托管调试助手“FatalExecutionEngineError '已在(路径)中检测到 问题。

附加信息:运行时遇到了 致命错误。错误的地址是0x79f387d1,线程 0x168c。错误代码是0xc0000005。此错误可能是CLR 中的错误或用户代码的不安全或不可验证部分中的错误。常见的 此错误的来源包括COM-interop的用户编组错误或PInvoke错误,这可能会破坏堆栈。

当寻找错误模式,我发现当我使用第二次相同类型库openstaad.dll的对象的,使用以下信息出现另一个错误:

例外的类型'System.Runtime.InteropServices.COMException' 发生在Microsoft.VisualBasic.dll中,但未在用户代码中处理 其他信息:La memoriaestábloqueada。 (Excepción德 HRESULT:0x8002000D(DISP_E_ARRAYISLOCKED))

我发现在互联网上两个主要的文章关于这个错误(System.AccessViolationException):

Programs randomly getting System.AccessViolationException

https://www.codeproject.com/Questions/106826/OpenFileDialog-OleDbConnection-AccessViolationExce

我尝试重新安装Access数据库引擎,以定义所述的环境变量并更改版本。什么都没有

任何帮助解决这个问题将不胜感激。

阿尔贝托·鲁伊斯

+1

您写道:“第一个连接已关闭,对应的对象设置为”Nothing“ - 您不应该将其设置为Nothing,您应该使用'.Dispose()'以便它可以清理正确地进行。其次,对于使用Excel应用程序实例的部分:[使用VB.NET处理Excel com对象的正确方法?](https://*.netcom/a/38111107/1115360) –

+0

你好安德鲁: 我认为你不能处置ADODB连接。我按照本文中的注释从内存中释放连接对象。 我没有Excel的问题。我使用API​​函数PostMessage关闭Excel进程。 非常感谢您的回复。 – AlbertoRuiz

+0

重点是我现在有ADODB的问题,突然出现,而我的应用程序中使用的代码中没有任何更改引用ADODB连接。 – AlbertoRuiz

我最近经历了同样的错误,第二使用Microsoft.ACE.OLEDB.12.0连接后,到MS Access在这种情况下。

对我有什么帮助的是将连接包装在一个新的线程中。 例如:如果你打开的连接有问题的代码是在方法OpenExcel你可以做到以下几点:

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

希望这有助于。