2013-10-17 96 views
0

簡而言之,我有一個VC++ DLL,它連接到MS Access(.mdb)文件並讀取數據。兩個Perl腳本將加載這個相同的DLL並讀取相同的數據。唯一的區別是perl腳本位於不同的文件夾中(比如文件夾'A'&文件夾'B')。MS Access OLEDB connection.open():未指定的錯誤

  1. 當文件夾'A'中的Perl腳本加載DLL並打開數據庫連接時,它成功。

  2. 當文件夾'B'中的Perl腳本加載DLL並打開數據庫連接時,它無法打開連接(發生異常)。

當我查看事件查看器時,發現以下日誌。

Faulting application name: perl.exe, version: 5.12.1.1201, time stamp: 0x4bed097d 
Faulting module name: msjet40.dll, version: 4.0.9756.0, time stamp: 0x49246e48 
Exception code: 0xc0000005 
Fault offset: 0x0007128f 
Faulting process id: 0x1634 
Faulting application start time: 0x01cecb4f0080e109 
Faulting application path: C:\Perl512\Perl\bin\perl.exe 
Faulting module path: C:\Windows\SysWOW64\msjet40.dll 
Report Id: 42f2cbc9-3742-11e3-91cd-001b2109685d 

enter image description here

OS: Windows 7專業版64位

微軟Office: MS Office 2007的標準版(不MS訪問完整版,僅在安裝Access運行時引擎)

連接字符串:strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"D:\\Documents\\LocalFile.mdb\"";

注:的DLL將始終連接到相同的MS Access文件,並使用相同的連接字符串

因爲從文件夾中的腳本「A」是能夠連接到數據庫,我不認爲有連接字符串中存在問題。 任何關於根本原因的想法/線索?

讓我知道,如果你需要任何額外的細節。提前致謝!

回答

1

我找到了根本原因:)。錯誤信息'未指定的錯誤'雖然不是很有幫助,但..

也許,我沒有給出足夠的信息來思考這裏的根本原因。無論如何,我將在此留下根本原因,以便爲某人指出方向可能會有所幫助。

使用Perl XS將DLL鏈接到Perl。在調用DLL函數之前,Perl XS爲該函數的輸出變量分配了大量的內存(幾乎爲1.76 GB)。

運行程序已經使用了一些內存。所以,總內存使用量約爲1.9 GB。當DLL試圖打開連接到MS Access數據庫時,Msjet40.dll可能已經耗盡內存。 'OutOfMemoryException'本來可以是合適的。但是我得到了'未指定的錯誤'。

我是如何調試的?

  1. (我知道,這是有趣的:))最初我是懷疑的MS Access文件。所以,我試圖Compact and Repair the MS Access file。顯然,它沒有工作。

  2. 然後我試圖將OleDbConnection更改爲OdbcConnection。至少,這顯示「系統資源超出」異常。

  3. 所以我開始VMMap來分析內存使用情況。在那裏我看到大量的內存是在堆中分配的。

因此找到了根本原因。

爲什麼文件夾「A」perl腳本沒有問題?

文件夾「A」perl腳本在調用DLL函數之前使用較少的內存。所以它不會超過the memory limit (2 GB) of Windows 32-bit process

0

從support.microsoft.com

如果您連接到Microsoft Access數據庫,然後你在一個過程中創建64間以上的連接,您可能會收到以下錯誤消息之一:

In Microsoft Visual Studio .NET: Unspecified error 

Steps to reproduce the behavior...


在使用關閉方法:

Connection屬性實際上返回到活動數據庫ActiveX數據對象(ADO)連接的一個副本的引用。因此,應用Close方法或以任何方式試圖改變通過Connection對象的方法或屬性將連接沒有Microsoft Access使用的實際連接對象上影響抱到當前的實時連接數據庫。

Microsoft Dev Center