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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.11.2013, 08:28   #1
Aleksandr
Форумчанин
 
Регистрация: 22.05.2007
Сообщений: 511
По умолчанию Транзакция

Как правильно сделать транзакцию?
Код:
form1.ZConnection1.StartTransaction;
try
MainForm.zQuery1.SQL.Clear;
MainForm.zQuery1.SQL.Add ('INSERT INTO base (Date_posting, Time_posting, num, Massa, Name, Image, Com, BaudRate, Organization, Location, IP, Note, Model, Equopment, Linkey, Stable_weight, Image_kamera)' );

MainForm.zQuery1.SQL.Add(' Values (:date1, :date2, 1, :massa, :name,''image'', :port, :BaudRate, :Organization, :Location, :Ip, :Note, :Model, :Equopment, :Linkey, 0, :adress)');
d3:=Trunc(Date);
d2:=frac(time);
MainForm.zQuery1.ParamByName('date1').Value:=d3;
MainForm.zQuery1.ParamByName('date2').Value:=d2;
MainForm.zQuery1.ParamByName('massa').Value:=MainForm.Edit1.Text;
MainForm.zQuery1.ParamByName('name').Value:=MainForm.labelModel1.Caption+' '+MainForm.LabelEquopment1.Caption;
MainForm.zQuery1.ParamByName('port').Value:=MainForm.labelPort1.Caption;
MainForm.zQuery1.ParamByName('BaudRate').Value:=MainForm.LabelBaudRate1.Caption;
MainForm.zQuery1.ParamByName('Organization').Value:=MainForm.LabelOrganization1.Caption;
MainForm.zQuery1.ParamByName('Location').Value:=MainForm.LabelLocation1.Caption;
MainForm.zQuery1.ParamByName('Ip').Value:=MainForm.LabelIp1.Caption;
MainForm.zQuery1.ParamByName('Note').Value:=MainForm.labelNote1.Caption;
MainForm.zQuery1.ParamByName('Model').Value:=MainForm.labelModel1.Caption;
MainForm.zQuery1.ParamByName('Equopment').Value:=MainForm.labelEquopment1.Caption;
MainForm.zQuery1.ParamByName('Linkey').Value:=MainForm.labelLinkey1.Caption;
MainForm.zQuery1.ParamByName('adress').Value:=OptionForm.DirectoryEdit1.Text+'\NO.jpg';
MainForm.zQuery1.ExecSQL;
form1.ZConnection1.Commit;
Except
form1.ZConnection1.Rollback;
end;
или
Код:
MainForm.zQuery2.SQL.Clear;
MainForm.zQuery2.SQL.Text:='Start transaction';
MainForm.zQuery2.ExecSQL;
try
MainForm.zQuery2.SQL.Clear;
MainForm.zQuery2.SQL.Add ('INSERT INTO base (Date_posting, Time_posting, num, Massa, Name, Image, Com, BaudRate, Organization, Location, IP, Note, Model, Equopment, Linkey, Stable_weight, Image_kamera)' );
MainForm.zQuery2.SQL.Add(' Values (:date1, :date2, 1, :massa, :name,''image'', :port, :BaudRate, :Organization, :Location, :Ip, :Note, :Model, :Equopment, :Linkey, 0, :adress)');
d3:=Trunc(Date);
d2:=frac(time);
MainForm.zQuery2.ParamByName('date1').Value:=d3;
MainForm.zQuery2.ParamByName('date2').Value:=d2;
MainForm.zQuery2.ParamByName('massa').Value:=MainForm.Edit2.Text;
MainForm.zQuery2.ParamByName('name').Value:=MainForm.labelModel2.Caption+' '+MainForm.LabelEquopment2.Caption;
MainForm.zQuery2.ParamByName('port').Value:=MainForm.labelPort2.Caption;
MainForm.zQuery2.ParamByName('BaudRate').Value:=MainForm.LabelBaudRate2.Caption;
MainForm.zQuery2.ParamByName('Organization').Value:=MainForm.LabelOrganization2.Caption;
MainForm.zQuery2.ParamByName('Location').Value:=MainForm.LabelLocation2.Caption;
MainForm.zQuery2.ParamByName('Ip').Value:=MainForm.LabelIp2.Caption;
MainForm.zQuery2.ParamByName('Note').Value:=MainForm.labelNote2.Caption;
MainForm.zQuery2.ParamByName('Model').Value:=MainForm.labelModel2.Caption;
MainForm.zQuery2.ParamByName('Equopment').Value:=MainForm.labelEquopment2.Caption;
MainForm.zQuery2.ParamByName('Linkey').Value:=MainForm.labelLinkey2.Caption;
MainForm.zQuery2.ParamByName('adress').Value:=OptionForm.DirectoryEdit1.Text+'\NO.jpg';
  MainForm.zQuery2.SQL.Text:='Commit';
MainForm.zQuery2.ExecSQL;
  Except
   MainForm.zQuery2.SQL.Text:='Rollback';
MainForm.zQuery2.ExecSQL;
end;
Aleksandr вне форума Ответить с цитированием
Старый 21.11.2013, 08:55   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Похоже, что правильно в обоих случаях. Если те методы ZConnection делают то, что я думаю. Только во 2-ом случае Commit выполнял бы отдельным ExecSQL. И не в рамках общего try в обоих случаях. Обычно еще начало транзакции заворачиваю в отдельный try ... except. По хорошему и завершение завернуть в try, и при except остается только рвать соединение и вываливаться из проги поскольку экзотичная ситуация и не понятно как дальше проге жить.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.11.2013, 08:58   #3
Aleksandr
Форумчанин
 
Регистрация: 22.05.2007
Сообщений: 511
По умолчанию

А если Qery создаются динамически или их несколько, то первый вариант подходит или нет?
Aleksandr вне форума Ответить с цитированием
Старый 21.11.2013, 09:34   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А какая разница? И в рамках одной транзакции несколько операций обновления и для разных таблиц. Транзакции в том числе именно для этого и предназначены
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.11.2013, 10:10   #5
Aleksandr
Форумчанин
 
Регистрация: 22.05.2007
Сообщений: 511
По умолчанию

Спасибо. Тему можно закрыть.
Aleksandr вне форума Ответить с цитированием
Старый 21.11.2013, 10:18   #6
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

зачем тут транзакции?
eval вне форума Ответить с цитированием
Старый 21.11.2013, 11:21   #7
Aleksandr
Форумчанин
 
Регистрация: 22.05.2007
Сообщений: 511
По умолчанию

Потому что одновременно могут добавляться записи.
Бьюсь уже почти третью неделю с этой записью данных от весовых терминалов в базу MySQL. Сейчас с применением транзакций выскакивает ошибка
Изображения
Тип файла: jpg ошибка.jpg (25.2 Кб, 46 просмотров)
Aleksandr вне форума Ответить с цитированием
Старый 21.11.2013, 11:24   #8
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
Потому что одновременно могут добавляться записи.
не видно ничего
eval вне форума Ответить с цитированием
Старый 21.11.2013, 11:25   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Что значит одновременно - с разных потоков? И какая СУБД?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.11.2013, 11:42   #10
Aleksandr
Форумчанин
 
Регистрация: 22.05.2007
Сообщений: 511
По умолчанию

Есть сервер который записывает данные от весовых терминалов в базу MySQL. В верхней части формы сервера есть DBGrid с местами установки весов. Каждая вкладка соответствует своему весовому терминалу. Подключение к весам и считывание осуществляется на каждой вкладке.
Чтобы было понятно прикладываю рисунок формы.
Подключаюсь с помощью IdTCPClient. Подключение и считывание делаю в потоке
Пробовал и через IdThreadComponent
и через потоки без класса TThread по статье в Delphi World

Если кто знает как решить эту проблему прошу помощи.
Заранее спасибо откликнувшимся.
Изображения
Тип файла: jpg форма.jpg (114.1 Кб, 121 просмотров)

Последний раз редактировалось Aleksandr; 21.11.2013 в 11:46.
Aleksandr вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Транзакция V_a_d БД в Delphi 14 12.11.2012 17:00
write-транзакция в MyDAC 3D Hunter БД в Delphi 7 05.03.2012 14:45