IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.
Модератор: kdv
-
connor74
- Сообщения: 11
- Зарегистрирован: 18 июн 2007, 08:24
Сообщение
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
Сообщение
avenger » 18 июн 2007, 09:10
Надо, наверно как нибудь так:
Код: Выделить всё
if (!sql->Transaction->Active)
sql->Transaction->StartTransaction();
-
stix-s
- Заслуженный разработчик
- Сообщения: 557
- Зарегистрирован: 13 дек 2005, 11:52
Сообщение
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.
В целом проблема решена.
Спасибо.