Вопрос, который мы рассмотрим, связан с ошибкой 216, возникающей при работе с SQL-базами данных через динамически загружаемую библиотеку (DLL) в среде Delphi 10.2 Tokyo. Эта проблема известна уже несколько лет и связана с последовательным освобождением драйверов dbExpress, что приводит к ошибке доступа при закрытии последнего драйвера, если был выполнен открытие соединения с базой данных.
Описание проблемы
Ошибка 216 возникает при вызове метода FMethodTable.FDBXBase_Close(FDriverHandle), который не обрабатывает исключения, что приводит к сбою в программе, использующей DLL.
Пример кода DLL
Код функции CheckConnection в модуле Unit7 DLL выглядит следующим образом:
unit Unit7;
interface
uses
System.SysUtils, Data.SqlExpr, Data.DBXMSSQL;
function CheckConnection(const ServerName, DatabaseName, UserName, Password: PAnsiChar): Boolean; stdCall export;
implementation
function CheckConnection(const ServerName, DatabaseName, UserName, Password: PAnsiChar): Boolean; stdCall export;
var
SQLConnection: TSQLConnection;
begin
SQLConnection := TSQLConnection.Create(nil);
try
// Настройка параметров соединения
SQLConnection.Open;
// Проверка состояния соединения
finally
SQLConnection.Close;
FreeAndNil(SQLConnection);
end;
end.
Вызов функции DLL из главного приложения
Для вызова функции CheckConnection используется следующий код в обработчике события нажатия кнопки:
procedure TForm8.Button1Click(Sender: TObject);
var
Server, Database, User, Password: AnsiString;
begin
// Получение параметров соединения
if CheckConnection(...then // Проверка соединения и вывод результата
end;
Подтвержденный ответ
Проблема была решена путем добавления параметра AutoUnloadDriver=True в блок [MSSQL] файла dbxdrivers.ini. Это позволяет избежать проблем с порядком освобождения драйверов. Также DevArt добавили поддержку этого параметра в свой драйвер для SQL Server, предоставив ночную сборку с исправлением.
Альтернативный ответ
Также было получено сообщение от Embarcadero о том, что добавление параметра AutoUnloadDriver=True в настройки драйвера может помочь в решении проблемы с ошибкой 216. Этот параметр нужно добавить в соответствующие разделы файла dbxdrivers.ini.
Рекомендации
Проверьте версию используемых драйверов и убедитесь, что они актуальны.
Проверьте настройки файла dbxdrivers.ini, возможно, потребуется добавить параметр AutoUnloadDriver=True в нужные разделы.
После внесения изменений перекомпилируйте проект и проверьте работоспособность соединения.
Заключение
Ошибка 216 в Delphi 10.2 Tokyo при работе с DLL может быть устранена путем корректной настройки порядка освобождения драйверов dbExpress и использования актуальных версий драйверов. Следуя рекомендациям и внедряя предложенные изменения, вы сможете избежать данной ошибки и обеспечить стабильную работу своего приложения.
должно быть представлено одним предложением, описывающим суть проблемы и условия ее возникновения в среде Delphi 10.2 Tokyo при работе с SQL через DLL, а именно устранение ошибки 216, связанной с неправильным порядком о
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS