2017-07-25 56 views
0

我在爲我公司開發的應用程序的最近兩週中遇到了令人沮喪的錯誤。第二次使用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://stackoverflow.netcom/a/38111107/1115360) –

+0

你好安德魯: 我認爲你不能處置ADODB連接。我按照本文中的註釋從內存中釋放連接對象。 我沒有Excel的問題。我使用API​​函數PostMessage關閉Excel進程。 非常感謝您的回覆。 – AlbertoRuiz

+0

重點是我現在有ADODB的問題,突然出現,而我的應用程序中使用的代碼中沒有任何更改引用ADODB連接。 – AlbertoRuiz

回答

0

我最近經歷了同樣的錯誤,第二使用Microsoft.ACE.OLEDB.12.0連接後,到MS Access在這種情況下。

對我有什麼幫助的是將連接包裝在一個新的線程中。 例如:如果你打開的連接有問題的代碼是在方法OpenExcel你可以做到以下幾點:

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

希望這有助於。