Одна транзакция в разных DLL

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
sdsfy
Сообщения: 43
Зарегистрирован: 03 апр 2008, 00:09

Одна транзакция в разных DLL

Сообщение sdsfy » 24 сен 2008, 12:17

Приветствую всех!

Программа написана на Delphi 2007, компоненты BDE сервер Interbase.

Я совершенно свободно явно создаю транзакцию и из всех компонентов типа TQuery и TTable через общий TDatabase получаю доступ именно к этой транзакции.Но мне необходимо получить доступ к этой же транзакции из другого DLL или COM объекта. Модифицировать данные в БД и читать из БД. Кто нить знает как это можно реализовать?

Gera
Сообщения: 53
Зарегистрирован: 12 мар 2008, 17:34

Re: Одна транзакция в разных DLL

Сообщение Gera » 24 сен 2008, 13:28

А, если не секрет, зачем?
Может лучше несколько по другому спроектировать приложение?

sdsfy
Сообщения: 43
Зарегистрирован: 03 апр 2008, 00:09

Re: Одна транзакция в разных DLL

Сообщение sdsfy » 24 сен 2008, 14:05

Дело в том, что у меня есть универсальный алгоритм модификации данных, пользуют им разные модули, сейчас этот алгоритм реализован в каждом отдельном модуле, я хочу вынести его в в COM передавая последнему данные и разновидность записи данных в БД. Смысл в том, что в БД должна производиться сложная многоступенчатая запись БД. Связанная информация генерируется по ходу из разных модулей, и вся эта муть делается для того, чтоб можно было сделать коллективный rollback. собственно все дело именно в этом.

Gera
Сообщения: 53
Зарегистрирован: 12 мар 2008, 17:34

Re: Одна транзакция в разных DLL

Сообщение Gera » 24 сен 2008, 14:40

Я не селен в работе с BDE, там с транзакциями вообще тяжко. Если использовать родные компоненты типа IBX, UIB... то можно через COM или при вызове DLL явно передавать в нее указатели на TConnection и TTransaction и работать и той же транзакцией в другом модуле.

sdsfy
Сообщения: 43
Зарегистрирован: 03 апр 2008, 00:09

Re: Одна транзакция в разных DLL

Сообщение sdsfy » 24 сен 2008, 15:01

что-то мне подсказывает, что и TDatabase каким-то макаром должен это реализовать. Но вот хочется узнать что говорит об этом люди разбирающиеся в BDE. Подсел я на это дело, к сожалению не могу соскочить. с удовольствием перешел бы на другие компоненты.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: Одна транзакция в разных DLL

Сообщение WildSery » 24 сен 2008, 17:23

BDE - это вообще-то не компоненты.
С удовольствием перешёл бы - переходи. Вполне серьёзно, безо всякого сарказма. Потом будет хуже.

Gera
Сообщения: 53
Зарегистрирован: 12 мар 2008, 17:34

Re: Одна транзакция в разных DLL

Сообщение Gera » 24 сен 2008, 17:27

после статьи http://www.ibase.ru/devinfo/bde.htm я решил использовать BDE только для файл-серверных BD

sdsfy
Сообщения: 43
Зарегистрирован: 03 апр 2008, 00:09

Re: Одна транзакция в разных DLL

Сообщение sdsfy » 24 сен 2008, 18:17

принимаю, BDE далеко не лучшее решение, может быть даже кривое и неправильное. Тогда какими наименьшими жертвами можно уже написанную программу перенести и на что? вернее на ЧТО? какие компоненты тумо можно подставить, чтоб минимально переписать код, с учетом того, что у меня используются компоненты TDatabase, TQuery, TStoredProc транзакции открываются, закрываются явно. Сегодня доступ к БД идет через BDE Alias. Собственно, тема первого поста тоже актуальна.

Спасибо коллеги за участие!

Slavik
Сообщения: 115
Зарегистрирован: 17 янв 2007, 11:52

Re: Одна транзакция в разных DLL

Сообщение Slavik » 24 сен 2008, 20:26

Несколько лет назад я участвовал в переводе одного большого оракловского проекта с BDE на компоненты прямого доступа ODAC. Выбор пал на них именно из-за их ну очень большой совместимости с BDE-компонентами по свойствам и методам. У них даже визард был по автоматическому переводу проекта. Кроме того можно было начинать использовать их параллельно, т.к. в составе библиотеки был компонент (аналог TDatabase), который мог использовать открытый BDE-шный коннект. Т.е. можно новые формы создавать с использованием новых компонентов, которые использовали тот же коннект, что и BDE-шные. И потихоньку переводить одну за другой существующие формы проекта. Перевод всего проекта завершился успешно, причём в достаточно сжатые сроки с минимальным использованием человеческих ресурсов и почти без ломки для остальных разработчиков.

Так вот. С тех пор у той же фирмы появилисть аналогичные библиотеки прямого доступа и для других SQL-серверов, в т.ч. и для IB/FB. Называются, по-моему, IBDAC (Interbase Direct Access Components). Только они все платные. Но цена того стоит, т.к. сильно экономится время и усилия.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: Одна транзакция в разных DLL

Сообщение WildSery » 24 сен 2008, 21:24

Slavik писал(а): т.к. в составе библиотеки был компонент (аналог TDatabase), который мог использовать открытый BDE-шный коннект.
Любые компоненты прямого доступа, что IBX, что FIB, могут использовать открытый 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);

Tonal
Сообщения: 104
Зарегистрирован: 30 сен 2007, 13:42

Re: Одна транзакция в разных DLL

Сообщение Tonal » 25 сен 2008, 09:52

Селеванов! Уходи с баркаса!!! (с)
Тфу, ты ... sdsfy уходи с BDE! :)

Те же IBX содержат TIBDatabase, TIBQuery, TIBStoredProc, TIBTransaction.
Так что переход может оказаться вполне прозрачным, если ты на какие-то спец-фичи не заложился.
Вот если много использовал TTable с локальными сортировками и фильтрациями - то можно изрядно влететь по скорости и памяти. :)

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: Одна транзакция в разных DLL

Сообщение WildSery » 25 сен 2008, 11:27

Tonal писал(а):
Селеванов! Уходи с баркаса!!! (с)
Тфу, ты ... sdsfy уходи с BDE! :)
Что за Селеванов? Всю жизнь вроде Верещагин был.

sdsfy
Сообщения: 43
Зарегистрирован: 03 апр 2008, 00:09

Re: Одна транзакция в разных DLL

Сообщение sdsfy » 25 сен 2008, 12:00

Честно сказать, с родными компонентами IB имел печальный опыт еще в 5-й Delphi. именно с транзакциями. Не мог понять что происходит, но как факт, все транзакции закрывались после любого запроса commit или rollback. Потом где-то в литературе вычитал, что это фича этих компонентов и как ты явно не управляй транзакцией, но commit как минимум после каждого запроса гарантирован. Уж не знаю, изменилось ли что нибудь в этом плане с тех пор, но рефлексы остались :)

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: Одна транзакция в разных DLL

Сообщение WildSery » 25 сен 2008, 12:27

"У меня был печальный опыт с яблоками - у них же шкурка, семечки, и их мыть надо. Поэтому я остался на яблочном пюре. Одно только не понимаю - как из пюре яблочный пирог приготовить, или дольками нарезать? Объясните мне, как у вас так получается? Возвращаться к сырым яблокам не хочу - рефлексы остались."

Срочно иди читай, что такое транзакции. Начни с этой вот статьи, а когда поймёшь, о чём речь, то переходишь к этой и ещё вот этой.

Gera
Сообщения: 53
Зарегистрирован: 12 мар 2008, 17:34

Re: Одна транзакция в разных DLL

Сообщение Gera » 25 сен 2008, 13:09

Я бы ещё посоветовал http://www.ibase.ru/devinfo/ibx.htm почитать. Там ответы на самые популярные вопросы с форума.

Tonal
Сообщения: 104
Зарегистрирован: 30 сен 2007, 13:42

Re: Одна транзакция в разных DLL

Сообщение Tonal » 25 сен 2008, 14:12

WildSery писал(а):
Tonal писал(а):
Селеванов! Уходи с баркаса!!! (с)
Тфу, ты ... sdsfy уходи с BDE! :)
Что за Селеванов? Всю жизнь вроде Верещагин был.
Точно, затупил. :)
Но с BDE всяко валить нужно.
И откуда её народ выкапывает.
Я понимаю мамонта какого поддерживать - сам маялся, а новые проекты - нет то же ADO взять и то геморою меньше будет. :)

Ответить