![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Transaction приводит в исключению [D7, XP]
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. Изменения в таком случае в таблицу заносятся, то есть подготовленные переменные и запрос не содержат ошибок. Тут какая-то принципиальная особенность я так думаю.. тонкость..