Страница 1 из 1

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

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

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 (через интернет), то вот такая беда случается.

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

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

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

Добавлено: 18 июн 2007, 09:10
avenger
Надо, наверно как нибудь так:

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

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

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

Добавлено: 18 июн 2007, 09:59
stix-s
avenger писал(а):Надо, наверно как нибудь так:

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

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

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

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

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

Добавлено: 18 июн 2007, 11:18
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 включен :)

Добавлено: 18 июн 2007, 11:33
connor74
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 включен :)
Мдяяя... век живи век учись, спасибо большое бум разбираться))

Добавлено: 19 июн 2007, 00:30
kdv
да и вообще. так не пишут. пишут вот так:

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

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

Добавлено: 21 июн 2007, 21:37
connor74
kdv писал(а):да и вообще. так не пишут. пишут вот так:

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

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