|
#1
|
|||
|
|||
Транзакции в DLL
Добрый день всем...
Перейду сразу к делу. Веду разработку MDI приложения, где дочерние окна подгружаются как отдельные плагины в виде DLL (не пакеты). Приложение работает с БД MySQL через MyDAC (пока последней версии). Вызов и закрытие всех окон происходит перекрестно через COM интерфесы. Задача состоит в том, чтобы иметь возможность вести единую транзакцию во всех окнах приложения. Пока ничего не получается. Сделаны следующие попытки: 1. Передача во все окна ссылки на TMyConnection. Ошибка сыпалась на вычисляемых полях (Invalid class typecast). 2. Переделал модуль данных в основном приложении на СОМ объект и передаю в DLL интерфейс на модуль данных. Ошибка пропала, но появилась такая же ошибка на dataset.fieldbyname('').value = value (именно когда fieldbyname в левой части). Хотелось бы послушать опыт решения проблемы, если она была решена. Полазил по инету - решение предлагается для БД Interbase как передача handle-а соединения, однако у TMyConnection-а нет никаких хендлов. В общем отдаю на ваш суд. Добавлю, что все проекты DLL и основной EXE скомпилированы с включенными в них рантайм пакетами в одной версии делфи 2009. Заранее благодарен. |
#2
|
|||
|
|||
Вариант - передавать в DLL указатель на функцию для запуска и окончания транзакции. При этом, хотя вызов придет из DLL, но код принадлежит основному модулю.
|
#3
|
|||
|
|||
Цитата:
Во втором описанном мною варианте реализации (модуль данных с интерфейсами) так и сделано... однако проблема в другом. Мне не удается подключиться к одному TMyConnection в ЕХЕ - источниками (DataSet-ами) данных в ДЛЛ. В общем как мне единогласно не один человек объяснил - в текущей конструкции VCL это невозможно сделать... Нужно переходить на BPL вместо DLL. |
#4
|
|||
|
|||
Ну, в принципе, да. Хотя есть вариант и обойти это.
Только всю работу с БД надо оставить в EXE, а в DLL передавать готовый TDataSet. Тогда прокатит. Делал такое. Работает, но получается все-равно довольно ограниченный функционал. |