第二次使用ADODB连接

时间:2017-07-25 09:42:58

标签: vb.net adodb

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

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

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

  • Staad.Pro文件,通过库 openstaad.dll 分发 Staad.Pro。
  • 一些Excel文件,通过 ADO Connection Recordset 对象。

该申请已令人满意地使用了三年。我最近做了一些更改,以使用外部Excel文件介绍数据的后台进程和每个项目公司的配置定义,该文件以前是在代码级别定义的。

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

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

因此,我在VS Community 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但未在用户代码中处理   其他信息:Lamemoriaestábloqueada。 (Excepciónde   HRESULT:0x8002000D(DISP_E_ARRAYISLOCKED))

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

Programs randomly getting System.AccessViolationException

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

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

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

Alberto Ruiz

1 个答案:

答案 0 :(得分:-1)

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

对我有帮助的是将连接包装在一个新线程中。 例如:如果打开连接的有问题的代码位于方法OpenExcel中,则可以执行以下操作:

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

希望这有帮助。

相关问题