我有一个在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.1
,dbxora30.dll
的版本为10.0.2151.25345
。
因为当并行安装多个客户端版本时它会引起问题,所讨论的机器只有11个客户端。使用Process Explorer,我已经验证只使用了来自11客户端的DLL。
有没有其他人遇到过这个问题,可以指出我正确的方向吗?
答案 0 :(得分:1)
对不起,我没有一个“好又甜”的解决方案可以修复它,但你可以考虑一些选项:
a)更改已使用的驱动程序,并尝试在客户端为指定数据库设置ODBC DSN后,通过ODBC访问数据库。可以在此处找到开源驱动程序:https://sourceforge.net/projects/open-dbexpress/
b)购买新版本的Delphi。我知道,这可能是一个真正的痛苦。它会花费金钱和时间(如果涉及第三方组件则更多),但有时候使用十多年前的产品并不是最好的主意。自那时起,公司和德尔福背后的知识产权已多次转型/出售给不同的公司。绝对没有机会获得这种传统产品的官方支持。
c)(非常难看,但可能有机会):建立一个池化机制,以防止关闭连接。听起来很荒谬,不是吗?