3

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のみが使用されていることを確認しました。

他の誰かがこの問題に遭遇し、私を正しい方向に向けることができますか?

4

1 に答える 1

1

申し訳ありませんが、私はそれを修正する「素敵で甘い」解決策を持っていませんが、あなたが検討するかもしれないいくつかのオプションがあります:

a)使用するドライバーを変更し、指定したデータベースのクライアントでODBC DSNを設定した後、ODBC経由でデータベースにアクセスしてみてください。オープンソースドライバーはここにあります:https ://sourceforge.net/projects/open-dbexpress/

b)Delphiの新しいバージョンを購入します。それは本当に苦痛かもしれません、私は知っています。費用と時間はかかりますが(サードパーティのコンポーネントが関係している場合はさらに多くなります)、10年以上前の製品を使用するのが最善のアイデアではない場合もあります。それ以来、Delphiの背後にある会社と知的財産は、さまざまな会社に何度か変革/販売されてきました。このレガシー製品の公式サポートを受ける機会は絶対にありません。

c)(本当に醜いですが、チャンスがあるかもしれません):接続が閉じられないようにプーリングメカニズムを構築します。本当にばかげているようですね。

于 2016-11-17T15:01:03.813 に答える