Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обработка транзакций [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?


Наверх

Титульная страница Поиск, карта сайта Написать письмо