![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обработка транзакций [D7, MSSQL]
Serge1 © (2004-05-13 12:51:00)Помогите разобраться!
Почему то не сохраняется результат выполнения запросов.
Программа работает с базой данных MS SQL SERVER 7.0.
Фрагмент программы:
procedure TFormRouteSheetEdit.ToolButtonSaveClick(Sender: TObject);
var
Zapros: TADOQuery;
begin
Zapros:=TADOQuery.Create(FormRouteSheetEdit);
Zapros.Connection:=ADOConnection1;
Zapros.Connection.BeginTrans;
Zapros.SQL.Clear;
Zapros.SQL.Add('UPDATE [Маршрутные листы]');
Zapros.SQL.Add('SET ... ');
Zapros.SQL.Add('WHERE Номер = ...');
try
Zapros.ExecSQL;
except
Zapros.Connection.RollbackTrans;
Zapros.Free;
exit;
end;
Zapros.SQL.Clear;
Zapros.SQL.Add('DELETE FROM [Табличная часть маршрутных листов]');
Zapros.SQL.Add('WHERE ([Номер маршрутного листа] = ... )');
Zapros.ExecSQL;
for NumberOfLine:=1 to N do begin
Zapros.SQL.Clear;
Zapros.SQL.Add('INSERT INTO [Табличная часть маршрутных листов]');
Zapros.SQL.Add('([Номер маршрутного листа], ...');
Zapros.SQL.Add('VALUES ('..., ...');
try
Zapros.ExecSQL;
except
if Zapros.Connection.InTransaction
then Zapros.Connection.RollbackTrans;
Zapros.Free;
exit;
end;
end;
if Zapros.Connection.InTransaction
then Zapros.Connection.CommitTrans;
// После этого ничего не сохраняется !!!
Zapros.Free;
Close;
end;
Johnmen (2004-05-13 14:24:00) [1]>>MU
Там Exit стоит, да!
MU (2004-05-13 14:14:00) [2]>>Johnmen ©
Там Exit стоит, нет?
Johnmen (2004-05-13 13:59:00) [3]>Единственной и неповторимой, открытой с помощью Zapros.Connection.BeginTrans;
Да ? По-моему она уже завершена на данный момент откатом...
:)))
Курдль (2004-05-13 13:47:00) [4]
> Вот скажи для начала, в рамках какой транзакции будет выполнено
> Zapros.ExecSQL;
Единственной и неповторимой, открытой с помощьюZapros.Connection.BeginTrans;
Johnmen (2004-05-13 13:38:00) [5]>А что? Откатится транзакция, освободятся ресурсы и процедура завершится.
Да ? Не всё так просто...
Вот скажи для начала, в рамках какой транзакции будет выполнено
Zapros.ExecSQL;
на
Zapros.SQL.Add('DELETE ...
?
Курдль (2004-05-13 13:34:00) [6]
> Можешь себе представить, что будет, если отработает первый
> except ? :)))
А что? Откатится транзакция, освободятся ресурсы и процедура завершится.
Ему нельзя <подтверждаем транзакцию>до того, как 2 записи в разных таблицах не уйдут к БД!
Johnmen (2004-05-13 13:30:00) [7]>Serge1
Можешь себе представить, что будет, если отработает первый except ? :)))
Общий подход (описанный кстати в хелпе):
<стартуем транзакцию>
try
<модификация данных в БД>
...
<подтверждаем транзакцию>
except
<откатываем транзакцию>
end;
sniknik (2004-05-13 13:28:00) [8]замени
BeginTrans/CommitTrans/RollbackTrans
на анологичное в SQL эквиваленте. ;о)
BEGIN TRANSACTION/...
а TADOQuery на TADOCommand
+ можеш обьеденить некоторые команды в пакеты (старт транзакции с первой командой к примеру ... ets)
Курдль (2004-05-13 13:08:00) [9]Перехватить запрос на сервер естьчем? Или, на крайняк, вывести в Memo текст перед
Zapros.ExecSQL;и попробовать его прокатать через интерактивный SQL-инструмент.
Serge1 (2004-05-13 13:01:00) [10]Да выходит и then Zapros.Connection.CommitTrans; выполняется, а результат ноль.
Курдль (2004-05-13 12:59:00) [11]А в пошаговом режиме программа выходит на
then Zapros.Connection.CommitTrans;?
Serge1 (2004-05-13 12:59:00) [12]Для того, чтобы освободить память занимаемую Zapros'ом.
Курдль (2004-05-13 12:53:00) [13]А зачем фрикать Zapros по Except?