Текущий архив: 2004.06.06;
Скачать: CL | DM;
Вниз
Обработка транзакций Найти похожие ветки
← →
Serge1 (2004-05-13 12:51) [0]Помогите разобраться!
Почему то не сохраняется результат выполнения запросов.
Программа работает с базой данных 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;
← →
Курдль © (2004-05-13 12:53) [1]А зачем фрикать Zapros по Except?
← →
Курдль © (2004-05-13 12:59) [2]А в пошаговом режиме программа выходит на
then Zapros.Connection.CommitTrans;
?
← →
Serge1 (2004-05-13 12:59) [3]Для того, чтобы освободить память занимаемую Zapros"ом.
← →
Serge1 (2004-05-13 13:01) [4]Да выходит и then Zapros.Connection.CommitTrans; выполняется, а результат ноль.
← →
Курдль © (2004-05-13 13:08) [5]Перехватить запрос на сервер естьчем? Или, на крайняк, вывести в Memo текст перед
Zapros.ExecSQL;
и попробовать его прокатать через интерактивный SQL-инструмент.
← →
sniknik © (2004-05-13 13:28) [6]замени
BeginTrans/CommitTrans/RollbackTrans
на анологичное в SQL эквиваленте. ;о)
BEGIN TRANSACTION/...
а TADOQuery на TADOCommand
+ можеш обьеденить некоторые команды в пакеты (старт транзакции с первой командой к примеру ... ets)
← →
Johnmen © (2004-05-13 13:30) [7]>Serge1
Можешь себе представить, что будет, если отработает первый except ? :)))
Общий подход (описанный кстати в хелпе):<стартуем транзакцию>
try
<модификация данных в БД>
...
<подтверждаем транзакцию>
except
<откатываем транзакцию>
end;
← →
Курдль © (2004-05-13 13:34) [8]
> Можешь себе представить, что будет, если отработает первый
> except ? :)))
А что? Откатится транзакция, освободятся ресурсы и процедура завершится.
Ему нельзя <подтверждаем транзакцию> до того, как 2 записи в разных таблицах не уйдут к БД!
← →
Johnmen © (2004-05-13 13:38) [9]>А что? Откатится транзакция, освободятся ресурсы и процедура завершится.
Да ? Не всё так просто...
Вот скажи для начала, в рамках какой транзакции будет выполненоZapros.ExecSQL;
наZapros.SQL.Add("DELETE ...
?
← →
Курдль © (2004-05-13 13:47) [10]
> Вот скажи для начала, в рамках какой транзакции будет выполнено
> Zapros.ExecSQL;
Единственной и неповторимой, открытой с помощьюZapros.Connection.BeginTrans;
← →
Johnmen © (2004-05-13 13:59) [11]>Единственной и неповторимой, открытой с помощью Zapros.Connection.BeginTrans;
Да ? По-моему она уже завершена на данный момент откатом...
:)))
← →
MU (2004-05-13 14:14) [12]>>Johnmen ©
Там Exit стоит, нет?
← →
Johnmen © (2004-05-13 14:24) [13]>>MU
Там Exit стоит, да!
Страницы: 1 вся ветка
Текущий архив: 2004.06.06;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.022 c