Выскакивает transaction is active

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

Модератор: kdv

Ответить
connor74
Сообщения: 11
Зарегистрирован: 18 июн 2007, 08:24

Выскакивает transaction is active

Сообщение connor74 » 18 июн 2007, 08:56

Здравствуйте,
есть проблема над которой бьюсь уже неделю. Подскажите пожалуйста как её решить:

Firebird 2.0
Использую IBX

Код на билдере

Код: Выделить всё

//ХП вставляет данные в несколько таблиц
void ExecSQL(TIBSQL *sql, AnsiString sql) {
  sql->Close();
  sql->SQL->Clear();
  sql->SQL->Add("EXECUTE PROCEDURE INSERT DEALS (<параметры>)");
  sql->Transaction->StartTransaction();
  try {
    sql->ExecQuery();
    sql->Transaction->Rollback();
  }
  catch(...) {
    sql->Transaction->Rollback();
  }
}
...
/*Далее при нажатии кнопки вызывается функция ExecSQL(), ей передается объект TIBSQL и текст запроса с параметрами из формы*/
...
Вылетает сообщение

transaction is active

Причем когда все это делается с локально базой - то все нормально, а когда по TSP/IP (через интернет), то вот такая беда случается.

Параметры транзакции заданы по умолчанию в билдере.

Заранее благодарен за помощь

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Re: Высккивает transaction is active

Сообщение avenger » 18 июн 2007, 09:10

Надо, наверно как нибудь так:

Код: Выделить всё

if (!sql->Transaction->Active)
  sql->Transaction->StartTransaction(); 

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Re: Высккивает transaction is active

Сообщение stix-s » 18 июн 2007, 09:59

avenger писал(а):Надо, наверно как нибудь так:

Код: Выделить всё

if (!sql->Transaction->Active)
  sql->Transaction->StartTransaction(); 
или хотя бы в компоненте TIBSQL вырубить автоматический старт транзакции

connor74
Сообщения: 11
Зарегистрирован: 18 июн 2007, 08:24

Сообщение connor74 » 18 июн 2007, 10:19

Сорри я чего то не допонимаю, а что разве там есть автомат? (сорри, просто вручную делал всегда и на локальные базы).

Да и ещё. После перезагрузки запись оказывается в базе.

Могет нужно чего в параметрах транзакции поменять?

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 18 июн 2007, 11:18

connor74 писал(а):Сорри я чего то не допонимаю, а что разве там есть автомат? (сорри, просто вручную делал всегда и на локальные базы).

Да и ещё. После перезагрузки запись оказывается в базе.

Могет нужно чего в параметрах транзакции поменять?
qoStartTransaction A transaction starts automatically before the query execution.
qoAutoCommit Sets a mode of automatic committing of changes. Do not use this option in the selectable query.

у меня, ФИБ+, канешна, но я думаю, можно ведь F1 тыкнуть на TIBSQL ?
поди еще и AutoCommit включен :)

connor74
Сообщения: 11
Зарегистрирован: 18 июн 2007, 08:24

Сообщение connor74 » 18 июн 2007, 11:33

stix-s писал(а):
connor74 писал(а):Сорри я чего то не допонимаю, а что разве там есть автомат? (сорри, просто вручную делал всегда и на локальные базы).

Да и ещё. После перезагрузки запись оказывается в базе.

Могет нужно чего в параметрах транзакции поменять?
qoStartTransaction A transaction starts automatically before the query execution.
qoAutoCommit Sets a mode of automatic committing of changes. Do not use this option in the selectable query.

у меня, ФИБ+, канешна, но я думаю, можно ведь F1 тыкнуть на TIBSQL ?
поди еще и AutoCommit включен :)
Мдяяя... век живи век учись, спасибо большое бум разбираться))

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 19 июн 2007, 00:30

да и вообще. так не пишут. пишут вот так:

Код: Выделить всё

try {
    sql->ExecQuery();
  }
  catch(...) {
    sql->Transaction->Rollback(); 
то есть - отменять транзакцию надо (если вообще надо) только при ошибке в execquery. Потому что если вдруг между execquery и rollback обрубится коннект, то обработчик ошибки попытается вызвать rollback еще раз, в чем никакого смысла нет.
Или, в блоке try надо писать execquery и commit.

connor74
Сообщения: 11
Зарегистрирован: 18 июн 2007, 08:24

Сообщение connor74 » 21 июн 2007, 21:37

kdv писал(а):да и вообще. так не пишут. пишут вот так:

Код: Выделить всё

try {
    sql->ExecQuery();
  }
  catch(...) {
    sql->Transaction->Rollback(); 
то есть - отменять транзакцию надо (если вообще надо) только при ошибке в execquery. Потому что если вдруг между execquery и rollback обрубится коннект, то обработчик ошибки попытается вызвать rollback еще раз, в чем никакого смысла нет.
Или, в блоке try надо писать execquery и commit.
Пршу прощения опечатка получилась, в блоке try стоит Commit.
В целом проблема решена.
Спасибо.

Ответить