Windows7で実行されているDelphi2006アプリケーションがあり、Oracle11クライアントインストールを使用してdbExpressを介してOracleデータベースに接続しています。最初の接続後、データをクエリでき、すべてが期待どおりに機能します。ただし、切断してから再接続すると、次のエラーが発生します。
Exception EAccessViolation in module orageneric11.dll at 00450EB5.
Access violation at address 048A0EB5 in module 'orageneric11.dll'.
Read of address 00000038
同じアプリケーションが、Oracle10クライアントインストールを使用するWindowsXPで正常に実行されています(残念ながら、XP +Oracle11またはWindows7+ Oracle 10でのテストセットアップはありません)。
私は問題を次のように減らしました:
program OracleReconnectTest;
{$APPTYPE CONSOLE}
uses
SysUtils,
SqlExpr;
var
connection: TSQLConnection;
begin
connection := TSQLConnection.Create( nil );
connection.DriverName := 'Oracle';
connection.LibraryName := 'dbxora30.dll';
connection.VendorLib := 'oci.dll';
connection.GetDriverFunc := 'getSQLDriverORACLE';
connection.LoginPrompt := False;
connection.Params.Text :=
'DATABASE=TheDatabase' + #$D#$A +
'USER_NAME=TheUser' + #$D#$A +
'PASSWORD=ThePassword' + #$D#$A +
'DECIMAL SEPARATOR=,';
connection.Connected := True;
Writeln( 'Connected once, press ENTER to disconnect and reconnect' );
Readln;
connection.Connected := False;
connection.Connected := True; // <- access violation on Windows 7 + Oracle 11
Writeln( 'Reconnected, press ENTER to exit' );
Readln;
end.
これにより、アプリケーションコードの問題が除外されると思います。Delphiに付属しているdbExpressコードをステップ実行しましたが、見た目が間違っている、またはこれを説明するようなものは見つかりませんでした。
そのため、これがdbExpressまたはOracleドライバのいずれかのバグであることを示すものは見つかりませんでした。したがって、EmbarcaderoやOracleにバグを報告するかどうかはわかりません。
のバージョンorageneric11.dll
は、、11.2.0.1
およびdbxora30.dll
バージョン10.0.2151.25345
です。
複数のクライアントバージョンを並行してインストールすると問題が発生するため、問題のマシンには11台のクライアントしかありません。Process Explorerを使用して、11クライアントからのDLLのみが使用されていることを確認しました。
他の誰かがこの問題に遭遇し、私を正しい方向に向けることができますか?