Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2009, 20:10   #1
zombikkk
 
Регистрация: 13.12.2009
Сообщений: 9
По умолчанию Transaction

Уже не раз поднималась эта тема,но конкретных примеров я так и не увидел( Понимаю,что такая конструкция:
Код:
try
ADOConnection1.BeginTrans;
...
ADOConnection1.CommitTrans;
except
...
ROLLBACK TRANS;
end;
А что конкретно писать??
Программа записывает данные в таблицу на сервер,надо если что-то не записалось, то произвести откат.Подскажите пожалуйста.

Последний раз редактировалось mihali4; 13.12.2009 в 21:32.
zombikkk вне форума Ответить с цитированием
Старый 13.12.2009, 21:02   #2
rockedit
Форумчанин
 
Аватар для rockedit
 
Регистрация: 18.03.2009
Сообщений: 109
По умолчанию

Здравствуйте. вам нужно ваши действия пропистаь между началом транзакции и концом
Код:
try
ADOConnection1.BeginTrans;
//вот здесь и пишите все операторы которые надо откатить если будет ошибка
ADOConnection1.CommitTrans;
except

ROLLBACK TRANS;
end;
п.с. код оформляеться при помоши #
И вообщето это тема БД
Мозг человека обычно загружен лишь на 10% своей мощности; остальное резерв для опереционной системы. Если помог не пожалей "+", это лучшее спасибо

Последний раз редактировалось rockedit; 13.12.2009 в 21:08.
rockedit вне форума Ответить с цитированием
Старый 13.12.2009, 21:11   #3
zombikkk
 
Регистрация: 13.12.2009
Сообщений: 9
По умолчанию

т.е. вот действия
Код:
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add (запрос);
ADOQuery1.Execsql;
делаю так:
Код:
try
ADOConnection1.BeginTrans;
ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add (запрос);
ADOQuery1.Execsql;
except
on EDatabaseError do
 showmessage('ошибка');
on EOleException do
 showmessage('ошибка');
end;
 ADOConnection1.RollbackTrans;
 ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add (запрос);
 ADOQuery1.Execsql;
end;
выводит мое сообщение,но мотом все равно вылезает ошибка.Что не так?

Последний раз редактировалось zombikkk; 13.12.2009 в 21:39.
zombikkk вне форума Ответить с цитированием
Старый 13.12.2009, 21:35   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Как и обычно - между try и except пишем те операторы, которые хотим выполнить, а после except - операторы, выполняющиеся при сбое.
ADOConnection1.RollbackTrans - это и есть команда отката.

Вам уже сказали:
У нас принято оформлять код специальным тэгом - кнопочка "#".
Модератор


Почему ADOConnection1.RollbackTrans вынесен за пределы except ???

Последний раз редактировалось mihali4; 13.12.2009 в 21:37.
mihali4 вне форума Ответить с цитированием
Старый 13.12.2009, 21:42   #5
rockedit
Форумчанин
 
Аватар для rockedit
 
Регистрация: 18.03.2009
Сообщений: 109
По умолчанию

Код:
TRY
ADOConnection1.BeginTrans;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add (запрос);
ADOQuery1.Execsql;
EXCEPT
on EDatabaseError do
showmessage('ошибка');
on EOleException do
showmessage('ошибка');
//end; - Этот end завершает обработку исколючительной ситуации
ADOConnection1.RollbackTrans;
END; //обработка заканчиваться должна сдесь по логнике вешей
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add (запрос);
ADOQuery1.Execsql;
end;
Мозг человека обычно загружен лишь на 10% своей мощности; остальное резерв для опереционной системы. Если помог не пожалей "+", это лучшее спасибо

Последний раз редактировалось rockedit; 13.12.2009 в 21:52.
rockedit вне форума Ответить с цитированием
Старый 13.12.2009, 21:45   #6
zombikkk
 
Регистрация: 13.12.2009
Сообщений: 9
По умолчанию

Код:
try
ADOConnection1.BeginTrans;
ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add (n);
ADOQuery1.Execsql;
except
on EDatabaseError do
begin
 showmessage('Ошибка');
ADOConnection1.RollbackTrans;
end;
on EOleException do
begin
 showmessage('Ошибка');
 ADOConnection1.RollbackTrans;
 end;
end;
 ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add (n);
 ADOQuery1.Execsql;
ADOConnection1.CommitTrans;
end;
все равно после ошибка(
zombikkk вне форума Ответить с цитированием
Старый 13.12.2009, 21:49   #7
rockedit
Форумчанин
 
Аватар для rockedit
 
Регистрация: 18.03.2009
Сообщений: 109
По умолчанию

Та я же написал! end лишний, он закрывает обработку исключительной ситуации!!
Код:
try
ADOConnection1.BeginTrans;
ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add (n);
ADOQuery1.Execsql;
except
on EDatabaseError do
begin
 showmessage('Ошибка');
ADOConnection1.RollbackTrans;
end;
on EOleException do
begin
 showmessage('Ошибка');
 ADOConnection1.RollbackTrans;
end;
 ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add (n);
 ADOQuery1.Execsql;
ADOConnection1.CommitTrans;
end;
еше вариант вы в обработке пишете код в котором вероятно возникла ошибка
Код:
 ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add (n);
 ADOQuery1.Execsql;
ADOConnection1.CommitTrans;
т.е. в это участке возникла ошибка и вы его по новой , но в этот раз ошибку то никто не обрабатывает
Мозг человека обычно загружен лишь на 10% своей мощности; остальное резерв для опереционной системы. Если помог не пожалей "+", это лучшее спасибо

Последний раз редактировалось rockedit; 13.12.2009 в 21:57.
rockedit вне форума Ответить с цитированием
Старый 13.12.2009, 21:57   #8
zombikkk
 
Регистрация: 13.12.2009
Сообщений: 9
По умолчанию

Извиняюсь,плохо смотрел.Спасибо,помогли!(а можно вопросик ,я тут не очень еще ориентируюсь,что за "+"??)
zombikkk вне форума Ответить с цитированием
Старый 13.12.2009, 22:00   #9
rockedit
Форумчанин
 
Аватар для rockedit
 
Регистрация: 18.03.2009
Сообщений: 109
По умолчанию

Ну это как бы условно, тут люди помогают просто так, если конечно вопросы не такие, на которые можно ответить просто поиском по форуму или же тупо напишите за меня. а плюс это типа вы добовляете рейтинг тому кто вам помог, оцениваете его ответ(если конечно считаете что ответ достоин оценки). слева значок весы, шекну на него можно увидеть что сообщению можно оставить отзыв(он может быть как положительный так и отрицательный)
Мозг человека обычно загружен лишь на 10% своей мощности; остальное резерв для опереционной системы. Если помог не пожалей "+", это лучшее спасибо

Последний раз редактировалось rockedit; 13.12.2009 в 22:03.
rockedit вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск