1

簡単に言えば、MS Access (.mdb) ファイルに接続してデータを読み取る VC++ dll があります。2 つの Perl スクリプトがこの同じ DLL をロードし、同じデータを読み取ります。唯一の違いは、perl スクリプトが別のフォルダー (フォルダー 'A' とフォルダー 'B' など) にあることです。

  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

ここに画像の説明を入力

OS: Windows 7 プロフェッショナル 64 ビット

MS Office: MS Office 2007 Standard エディション (MS Access フルバージョンなし、Access Runtime Engine のみインストール)

接続文字列: strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"D:\\Documents\\LocalFile.mdb\"";

注: DLL は常に同じ MS Access ファイルに接続し、同じ接続文字列を使用します。

フォルダ「A」のスクリプトはデータベースに接続できるので、接続文字列に問題はないと思います。根本的な原因についてのアイデア/手がかりはありますか?

追加の詳細が必要な場合はお知らせください。前もって感謝します!

4

2 に答える 2

2

私は根本的な原因を見つけました:)。エラーメッセージ「Unspecified error」はあまり役に立ちません..

たぶん、ここで根本的な原因を考えるのに十分な情報を提供していません. とにかく、根本的な原因をここに残しておきますので、誰かの方向性を指摘するのに役立つかもしれません.

DLL は、Perl XS を使用して Perl にリンクされます。DLL 関数を呼び出す前に、Perl XS は関数の出力変数に膨大な量のメモリ (約 1.76 GB) を割り当てました。

実行中のプログラムによって使用されるメモリがすでに存在します。したがって、合計メモリ使用量は ~ 1.9 GB です。DLL が MS Access データベースへの接続を開こうとしているときに、Msjet40.dll がメモリ不足になっている可能性があります。' OutOfMemoryException ' が適切だった可能性があります。しかし、「不明なエラー」が発生しました。

どのようにデバッグしましたか?

  1. (私は知っています、それは面白いです:))最初、私はMS Accessファイルについて疑っていました。そこで、 MS Access ファイルの圧縮と修復を試みました。明らかに、うまくいきませんでした。

  2. 次に、 OleDbConnectionをOdbcConnectionに変更しようとしました。少なくとも、これにより「System Resource Exceedeed」例外が明らかになりました。

  3. そこで、メモリ使用量を分析するためにVMMapを開始しました。そこで、大量のメモリがヒープに割り当てられていることがわかりました。

したがって、根本原因を突き止めました。

フォルダ「A」の perl スクリプトで問題が発生しなかったのはなぜですか?

フォルダ「A」の perl スクリプトは、DLL 関数を呼び出す前に使用するメモリが少なくなります。そのため、 Windows 32 ビット プロセスのメモリ制限 (2 GB) を超えません。

于 2013-10-19T10:57:48.223 に答える
1

support.microsoft.com から

Microsoft Access データベースに接続し、1 つのプロセスで 64 を超える接続を作成すると、次のいずれかのエラー メッセージが表示されることがあります。

In Microsoft Visual Studio .NET:    Unspecified error

現象を再現する手順...


Closeメソッドを使用する場合:

Connection プロパティは、アクティブなデータベースの ActiveX データ オブジェクト (ADO) 接続のコピーへの参照を実際に返します。したがって、Close メソッドを適用するか、Connection オブジェクトのメソッドまたはプロパティを使用して接続を変更しようとしても、Microsoft Access が現在のデータベースへのライブ接続を保持するために使用する実際の接続オブジェクトには影響しません。

Microsoft デベロッパー センターから

于 2016-07-16T03:03:47.043 に答える