![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Всем привет)
Столкнулся с такой ерундовиной, что, если в блоке Код:
try
ADOConnection.BeginTrans;
// вставка в БД
ADOConnection.CommitTrans;
except
ADOConnection.RollbackTrans;
end;Как избежать? Отключаться не вариант... |
|
#2
|
||||
|
||||
|
А что за база? Может лучше явно вызывать ExecSQL('BEGIN TRANSACTION')?
|
|
#3
|
||||
|
||||
|
MySQL
Да, забыл сказать, что между beginTrans и CommitTrans не только вставка, но и много всего всякого - апдейт, селект и т.д. Что, впрочем, логично |
|
#4
|
||||
|
||||
|
А не может быть так, что означенные манипуляции с транзакцией всунуты в какой-нибудь обработчик события DataSet-а, и в процессе его выполнения происходит неявный рекурсивный вход в него?
|
| Этот пользователь сказал Спасибо Freeman за это полезное сообщение: | ||
Mrak (04.04.2014)
| ||
|
#5
|
||||
|
||||
|
Я делаю явный запуск транзакции через выполнение запроса begin transaction, чтоб уж наверняка. На адо как-то не особо полагаюсь (из всего адо использую только квери и команд).
|
| Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение: | ||
Mrak (04.04.2014)
| ||
|
#6
|
||||
|
||||
|
Вобщем, извините, но разбираться нет времени(((
Скажите, так правильно оформлять: Код:
try
dm.PROTO_Connection.BeginTrans;
if query_open(false, ADOQuery_Slut, 'INSERT INTO klients.klients ' +
'(поля) VALUES (значения)', 'Ошибка подключения к БД!') = false then
exit;
if query_open(true, ADOQuery_Slut, 'SELECT LAST_INSERT_ID() FROM klients.klients',
'Ошибка подключения к БД!') = false then exit;
IdKlient:=ADOQuery_Slut.FieldByName('last_insert_id()').AsString;
if query_open(false, ADOQuery_Slut, 'INSERT INTO proto.sc_zn ' +
'(поля) VALUES (значения)', 'Ошибка подключения к БД!') = false then exit;
dm.PROTO_Connection.CommitTrans;
except
dm.PROTO_Connection.RollbackTrans;
exit;
end;
...
function query_open(for_select: Boolean; querik: tadoquery; zapros, err_msg: string): boolean; // возвращает True, если запрос выполнился
begin
Result:= true;
querik.Close;
Querik.SQL.text:=zapros;
try
if for_select = true then Querik.open
else querik.ExecSQL;
except
on E : Exception do
begin
screen.Cursor:=crDefault;
messageDlg(err_msg + #13 + #13 + '[' + E.Message + ']', mtError, [mbOK], 0);
querik.Close;
Result:= false;
end;
end;
end;
|