Одна транзакция в разных DLL
Модератор: kdv
Одна транзакция в разных DLL
Приветствую всех!
Программа написана на Delphi 2007, компоненты BDE сервер Interbase.
Я совершенно свободно явно создаю транзакцию и из всех компонентов типа TQuery и TTable через общий TDatabase получаю доступ именно к этой транзакции.Но мне необходимо получить доступ к этой же транзакции из другого DLL или COM объекта. Модифицировать данные в БД и читать из БД. Кто нить знает как это можно реализовать?
Программа написана на Delphi 2007, компоненты BDE сервер Interbase.
Я совершенно свободно явно создаю транзакцию и из всех компонентов типа TQuery и TTable через общий TDatabase получаю доступ именно к этой транзакции.Но мне необходимо получить доступ к этой же транзакции из другого DLL или COM объекта. Модифицировать данные в БД и читать из БД. Кто нить знает как это можно реализовать?
Re: Одна транзакция в разных DLL
А, если не секрет, зачем?
Может лучше несколько по другому спроектировать приложение?
Может лучше несколько по другому спроектировать приложение?
Re: Одна транзакция в разных DLL
Дело в том, что у меня есть универсальный алгоритм модификации данных, пользуют им разные модули, сейчас этот алгоритм реализован в каждом отдельном модуле, я хочу вынести его в в COM передавая последнему данные и разновидность записи данных в БД. Смысл в том, что в БД должна производиться сложная многоступенчатая запись БД. Связанная информация генерируется по ходу из разных модулей, и вся эта муть делается для того, чтоб можно было сделать коллективный rollback. собственно все дело именно в этом.
Re: Одна транзакция в разных DLL
Я не селен в работе с BDE, там с транзакциями вообще тяжко. Если использовать родные компоненты типа IBX, UIB... то можно через COM или при вызове DLL явно передавать в нее указатели на TConnection и TTransaction и работать и той же транзакцией в другом модуле.
Re: Одна транзакция в разных DLL
что-то мне подсказывает, что и TDatabase каким-то макаром должен это реализовать. Но вот хочется узнать что говорит об этом люди разбирающиеся в BDE. Подсел я на это дело, к сожалению не могу соскочить. с удовольствием перешел бы на другие компоненты.
Re: Одна транзакция в разных DLL
BDE - это вообще-то не компоненты.
С удовольствием перешёл бы - переходи. Вполне серьёзно, безо всякого сарказма. Потом будет хуже.
С удовольствием перешёл бы - переходи. Вполне серьёзно, безо всякого сарказма. Потом будет хуже.
Re: Одна транзакция в разных DLL
после статьи http://www.ibase.ru/devinfo/bde.htm я решил использовать BDE только для файл-серверных BD
Re: Одна транзакция в разных DLL
принимаю, BDE далеко не лучшее решение, может быть даже кривое и неправильное. Тогда какими наименьшими жертвами можно уже написанную программу перенести и на что? вернее на ЧТО? какие компоненты тумо можно подставить, чтоб минимально переписать код, с учетом того, что у меня используются компоненты TDatabase, TQuery, TStoredProc транзакции открываются, закрываются явно. Сегодня доступ к БД идет через BDE Alias. Собственно, тема первого поста тоже актуальна.
Спасибо коллеги за участие!
Спасибо коллеги за участие!
Re: Одна транзакция в разных DLL
Несколько лет назад я участвовал в переводе одного большого оракловского проекта с BDE на компоненты прямого доступа ODAC. Выбор пал на них именно из-за их ну очень большой совместимости с BDE-компонентами по свойствам и методам. У них даже визард был по автоматическому переводу проекта. Кроме того можно было начинать использовать их параллельно, т.к. в составе библиотеки был компонент (аналог TDatabase), который мог использовать открытый BDE-шный коннект. Т.е. можно новые формы создавать с использованием новых компонентов, которые использовали тот же коннект, что и BDE-шные. И потихоньку переводить одну за другой существующие формы проекта. Перевод всего проекта завершился успешно, причём в достаточно сжатые сроки с минимальным использованием человеческих ресурсов и почти без ломки для остальных разработчиков.
Так вот. С тех пор у той же фирмы появилисть аналогичные библиотеки прямого доступа и для других SQL-серверов, в т.ч. и для IB/FB. Называются, по-моему, IBDAC (Interbase Direct Access Components). Только они все платные. Но цена того стоит, т.к. сильно экономится время и усилия.
Так вот. С тех пор у той же фирмы появилисть аналогичные библиотеки прямого доступа и для других SQL-серверов, в т.ч. и для IB/FB. Называются, по-моему, IBDAC (Interbase Direct Access Components). Только они все платные. Но цена того стоит, т.к. сильно экономится время и усилия.
Re: Одна транзакция в разных DLL
Любые компоненты прямого доступа, что IBX, что FIB, могут использовать открытый BDE-коннект. Это простая передача хэндла соединения, реализуется практически одной строкой кода.Slavik писал(а): т.к. в составе библиотеки был компонент (аналог TDatabase), который мог использовать открытый BDE-шный коннект.
Например:
Код: Выделить всё
function GetNativeHandle(Handle: HDBIDB): Pointer;
var FLength: Word;
begin
Result:=nil;
DBTables.Check(DBIGetProp(HDBIOBJ(Handle), dbNATIVEHNDL, @Result, SizeOf(Pointer), FLength));
end;
IBDatabase.Handle:=GetNativeHandle(BDE_Handle);
Re: Одна транзакция в разных DLL
Тфу, ты ... sdsfy уходи с BDE!Селеванов! Уходи с баркаса!!! (с)
Те же IBX содержат TIBDatabase, TIBQuery, TIBStoredProc, TIBTransaction.
Так что переход может оказаться вполне прозрачным, если ты на какие-то спец-фичи не заложился.
Вот если много использовал TTable с локальными сортировками и фильтрациями - то можно изрядно влететь по скорости и памяти.
Re: Одна транзакция в разных DLL
Что за Селеванов? Всю жизнь вроде Верещагин был.Tonal писал(а):Тфу, ты ... sdsfy уходи с BDE!Селеванов! Уходи с баркаса!!! (с)
Re: Одна транзакция в разных DLL
Честно сказать, с родными компонентами IB имел печальный опыт еще в 5-й Delphi. именно с транзакциями. Не мог понять что происходит, но как факт, все транзакции закрывались после любого запроса commit или rollback. Потом где-то в литературе вычитал, что это фича этих компонентов и как ты явно не управляй транзакцией, но commit как минимум после каждого запроса гарантирован. Уж не знаю, изменилось ли что нибудь в этом плане с тех пор, но рефлексы остались
Re: Одна транзакция в разных DLL
"У меня был печальный опыт с яблоками - у них же шкурка, семечки, и их мыть надо. Поэтому я остался на яблочном пюре. Одно только не понимаю - как из пюре яблочный пирог приготовить, или дольками нарезать? Объясните мне, как у вас так получается? Возвращаться к сырым яблокам не хочу - рефлексы остались."
Срочно иди читай, что такое транзакции. Начни с этой вот статьи, а когда поймёшь, о чём речь, то переходишь к этой и ещё вот этой.
Срочно иди читай, что такое транзакции. Начни с этой вот статьи, а когда поймёшь, о чём речь, то переходишь к этой и ещё вот этой.
Re: Одна транзакция в разных DLL
Я бы ещё посоветовал http://www.ibase.ru/devinfo/ibx.htm почитать. Там ответы на самые популярные вопросы с форума.
Re: Одна транзакция в разных DLL
Точно, затупил.WildSery писал(а):Что за Селеванов? Всю жизнь вроде Верещагин был.Tonal писал(а):Тфу, ты ... sdsfy уходи с BDE!Селеванов! Уходи с баркаса!!! (с)
Но с BDE всяко валить нужно.
И откуда её народ выкапывает.
Я понимаю мамонта какого поддерживать - сам маялся, а новые проекты - нет то же ADO взять и то геморою меньше будет.