为什么通过dbExpress重新连接到Oracle数据库会导致访问冲突?

时间:2012-10-23 19:22:51

标签: delphi windows-7 oracle11g dbexpress

我有一个在Windows 7上运行的Delphi 2006应用程序,它通过dbExpress使用Oracle 11客户端安装连接到Oracle数据库。第一次连接后,我可以查询数据,一切都按预期工作。但是,当我断开连接然后重新连接时,我收到以下错误:

Exception EAccessViolation in module orageneric11.dll at 00450EB5. 
Access violation at address 048A0EB5 in module 'orageneric11.dll'.
Read of address 00000038

使用Oracle 10客户端安装在Windows XP上运行相同的应用程序(遗憾的是,我没有使用XP + Oracle 11或Windows 7 + 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.1dbxora30.dll的版本为10.0.2151.25345

因为当并行安装多个客户端版本时它会引起问题,所讨论的机器只有11个客户端。使用Process Explorer,我已经验证只使用了来自11客户端的DLL。

有没有其他人遇到过这个问题,可以指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

对不起,我没有一个“好又甜”的解决方案可以修复它,但你可以考虑一些选项:

a)更改已使用的驱动程序,并尝试在客户端为指定数据库设置ODBC DSN后,通过ODBC访问数据库。可以在此处找到开源驱动程序:https://sourceforge.net/projects/open-dbexpress/

b)购买新版本的Delphi。我知道,这可能是一个真正的痛苦。它会花费金钱和时间(如果涉及第三方组件则更多),但有时候使用十多年前的产品并不是最好的主意。自那时起,公司和德尔福背后的知识产权已多次转型/出售给不同的公司。绝对没有机会获得这种传统产品的官方支持。

c)(非常难看,但可能有机会):建立一个池化机制,以防止关闭连接。听起来很荒谬,不是吗?