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

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

Transaction приводит в исключению [D7, XP]


Страницы:   1 2 3

delphinub ©   (2008-03-25 22:54:00) 

Сразу дабы не быть голословным привожу кусок кода

procedure TExcel.Change(FileName: String);
var i: integer;
begin
 DataModule1.OpenQuery.SQL.Clear;
 DataModule1.OpenQuery.SQL.Add('SELECT * FROM modifies');
 DataModule1.OpenQuery.Open;

 //DataModule1.MSSQLConnection.StartTransaction(TransDesc);
for i:=0 to DataModule1.OpenQuery.RecordCount-1 do
 begin
   CompName := DataModule1.OpenQuery.Fields[1].AsString;
   Value := DataModule1.OpenQuery.Fields[0].AsString;
   qua := DataModule1.OpenQuery.Fields[2].AsInteger;

   DataModule1.QueryComp.SQL.Clear;
   DataModule1.QueryComp.SQL.Add('UPDATE '+CompName+' SET quantity=quantity-'+IntToStr(qua)+' WHERE name='''+Value+'''');
   DataModule1.QueryComp.ExecSQL();

   DataModule1.OpenQuery.Next;
 end;
 //DataModule1.MSSQLConnection.Commit(TransDesc);
 exc.SaveFile(FileName);
 DataModule1.OpenQuery.Close;
end;


раскомментирование управления транкзацией приводит к ошибке в выделенной строке с текстом EDatabaseError with Message ''. Да, сообщение пустое :) Просто исключение не понимаю почему.


Loginov Dmitry   (2008-03-26 00:34:00) [41]

> цикл if

for, разумеется


Loginov Dmitry   (2008-03-26 00:33:00) [42]

1) Возможно, транзакцию требуется стартануть до OpenQuery.Open, либо же что-то где-то настроено неверно.
2) Для перебора записей цикл ifне используют. Правильно так:

DataModule1.OpenQuery.First;
while not DataModule1.OpenQuery.Eof do
begin
 // Обработка очередной записи
 DataModule1.OpenQuery.Next;
end;


3) Защити работу с набором данных DataModule1.OpenQuery с помощью оператора try..finally:
DataModule1.OpenQuery.Open;
try
 //
finally
 DataModule1.OpenQuery.Close;
end;

Иначе при возникающих в функции ошибках она становится "одноразовой", т.к. после первого вызова дело до Close не доходит, а при втором вызове ошибка произойдет на SQL.Clear, а это только усложняет отладку.


delphinub   (2008-03-25 22:55:00) [43]

кстати, если в таблице modifies была всего одна строчка, то почему-то всё срабатывает без ошибок..


Страницы:   1 2 3

Наверх

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