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 ''. Да, сообщение пустое :) Просто исключение не понимаю почему.


Johnmen   (2008-03-26 16:21:00) [21]


> наблюдается такое же исключение после которого если нажать
> F9 появляется табличка Данные не изменены!...

Давай так, тебе задают КОНКРЕТНЫЕ уточняющие вопросы, ты на них КОНКРЕТНО отвечаешь.
Какое именно исключение наблюдается?
На какой строке кода?

ЗЫ
повторю что без этих строчек про transaction всё работает на раз.
Зачем тогда ты написал эти строчки про transaction?


delphinub   (2008-03-26 16:02:00) [22]

повторю что без этих строчек про transaction всё работает на раз. Изменения вносятся при любом количестве записей в таблице modifies. Проверял через Enterprise Manager


delphinub   (2008-03-26 16:01:00) [23]

наблюдается такое же исключение после которого если нажать F9 появляется табличка Данные не изменены!...


Johnmen   (2008-03-26 15:53:00) [24]


> Ниче не меняется.

А что наблюдается?


delphinub   (2008-03-26 15:49:00) [25]

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

 DataModule1.MSSQLConnection.StartTransaction(TransDescr);
  try
   DataModule1.OpenQuery.Open;
   while not DataModule1.OpenQuery.Eof 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(TransDescr);
except
   DataModule1.MSSQLConnection.Rollback(TransDescr);
   ShowMessage('Данные не изменены!');
end;
 DataModule1.OpenQuery.Close;
end;


Окей ввел сюда try-except. До этого они стояли при вызове функции. Ниче не меняется.


Johnmen   (2008-03-26 15:34:00) [26]


> так в вышенаписаном коде суть так же

не так же.


delphinub   (2008-03-26 15:25:00) [27]

ANB да правильно поняли!


delphinub   (2008-03-26 15:24:00) [28]

так в вышенаписаном коде суть так же


ANB   (2008-03-26 15:24:00) [29]


> delphinub   (26.03.08 15:18) [13]

Я правильно понял, что в первой таблице (по которой идет цикл) хранятся имена таблиц, которые надо обновлять ?


Johnmen   (2008-03-26 15:22:00) [30]

StartTransaction;
try
 ...
 Commit;
except
 RollBack;
end;


delphinub   (2008-03-26 15:18:00) [31]

Нет, я использую DBExpress с его компонентами. Я немного не понял что смущает.. Как еще можно реализовать подобное обновление таблицы?


Johnmen   (2008-03-26 15:12:00) [32]

Это точно не АДО. Нет там таких методов у объектов.

>delphinub  

А что?


Anatoly Podgoretsky   (2008-03-26 15:02:00) [33]

У тебя что за компоненты, не АДО ли случайно, тогда послушай sniknik, что он говорит по поводу использования TAdoQuery - очень наглядный пример к его утверждению.

Прокляну Борланда за подобную подлость по отношению к подрастающему поколению, постарались не хуже Архангельского.


Anatoly Podgoretsky   (2008-03-26 14:59:00) [34]

Смущает меня это "DataModule1.QueryComp.SQL." в одной транзакции, ты чего экономишь на спичках


delphinub   (2008-03-26 14:43:00) [35]

Loginov, Dmitry: я владею конструкциями try-expect и try-finally и активно их использую, просто в данном случае это не приводит к каким-либо положительным последствиям, всё равно возникает исключение и транкзация откатывается назад. А по сути и откатывать нечего, так как изменения еще не вносились.

ЮЮ: наверное это от того, что я не знаю такого простого способа.

Тем не менее вопрос остается открытым...


ЮЮ   (2008-03-26 08:37:00) [36]

Если это MS SQL, почему не написать 1 запрос на UDATE вместо этого "программирования"?


Loginov Dmitry   (2008-03-26 08:02:00) [37]

> Защитил но это не от сюда


что значит "но это не от сюда"? Защищать нужно всегда, иначе правильного и надежного приложения никогда не сделаешь.
А в твоем случае еще и для транзакции TRY..FINALLY нужен:

DataModule1.MSSQLConnection.StartTransaction(TransDesc);
try
 // ..................
 DataModule1.MSSQLConnection.Commit(TransDesc);
finally
 if DataModule1.MSSQLConnection.InTransaction then
   DataModule1.MSSQLConnection.RollBack;
end;

приблизительно так


delphinub   (2008-03-26 02:12:00) [38]

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

 DataModule1.MSSQLConnection.StartTransaction(TransDesc);
 DataModule1.OpenQuery.Open;

 while not DataModule1.OpenQuery.Eof 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);
 DataModule1.OpenQuery.Close;
end;


жирным выделил не срабатывающую в первой итерации команду


Anatoly Podgoretsky   (2008-03-26 01:54:00) [39]

Где новый код?


delphinub   (2008-03-26 01:18:00) [40]

1) Стартую до. Ничего не изменилось
2) Изменил цикл на while. Ошибка стала вываливаться в главный юнит туда, от куда вызывается функция change.
3) Защитил но это не от сюда:

Грамотно пользоваться отлпадчиками я не умею, однако при помощи пресловутой i и инкремента я выяснил, что ошибка возникает при _первой_ итерации цикла while на строчке

DataModule1.QueryComp.ExecSQL();

напоминаю, что в случае, когда итерация _всего одна_ и второй не предполагается, то ошибки нет. Также её нет если убрать transaction. Изменения в таком случае в таблицу заносятся, то есть подготовленные переменные и запрос не содержат ошибок. Тут какая-то принципиальная особенность я так думаю.. тонкость..


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

Наверх

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