У меня есть приложение Delphi 2006, работающее в Windows 7, которое подключается к базе данных Oracle через dbExpress с помощью установки клиента Oracle 11. После первого подключения я могу запросить данные, и все работает как положено. Однако, когда я отключаюсь, а затем снова подключаюсь, я получаю следующую ошибку:
Exception EAccessViolation in module orageneric11.dll at 00450EB5.
Access violation at address 048A0EB5 in module 'orageneric11.dll'.
Read of address 00000038
Это же приложение отлично работает в Windows XP с использованием установки клиента Oracle 10 (к сожалению, у меня нет тестовой установки с 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.
Я полагаю, это исключает проблему с кодом моего приложения. Я просмотрел код dbExpress, поставляемый с Delphi, но не обнаружил ничего, что выглядело бы неправильно или объясняло бы это.
Поэтому я не смог найти ничего, что указывало бы на ошибку ни в dbExpress, ни в драйвере Oracle. Следовательно, я не знаю, следует ли сообщать об ошибке в Embarcadero и/или Oracle.
Версия orageneric11.dll
— это 11.2.0.1
, а dbxora30.dll
— это версия 10.0.2151.25345
.
Поскольку параллельная установка нескольких версий клиента вызывала проблемы, на рассматриваемой машине установлен только клиент 11. Используя Process Explorer, я убедился, что используются только библиотеки DLL от клиента 11.
Кто-нибудь еще сталкивался с этой проблемой и может указать мне правильное направление?