Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
8 / 8 / 7
Регистрация: 01.01.2016
Сообщений: 386
1

Разобраться с транзакциями MySQL+dbExpress

04.05.2016, 18:01. Показов 1826. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Нужно разобраться как использовать транзакции, теорию почитал, теперь хотелось бы на практике научится.
Есть такой код, ввод в БД через форму. Подскажите куда вставлять и что, чтобы работали транзакции.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
begin
art:=Edit1.Text;
 zayav:=Edit2.Text;
 DataModule1.SQLQuery1.Active:=false;
 DataModule1.SQLQuery1.SQL.Text:='Select IDModelCartridga From SprModeleyCartridgey' +
 ' Where ModelCartridga = "'+ComboBox1.Text+'"';
 DataModule1.SQLQuery1.Active:=true;
 md:=DataModule1.SQLQuery1.FieldByName('IDModelCartridga').Value;
 
 DataModule1.SQLQuery1.Active:=false;
 DataModule1.SQLQuery1.SQL.Text:='Select IDKlienta From SprKlientov' +
 ' Where NameKlient = "'+ComboBox2.Text+'"';
 DataModule1.SQLQuery1.Active:=true;
 kl:=DataModule1.SQLQuery1.FieldByName('IDKlienta').Value;
 
  DataModule1.SQLQuery1.Active:=false;
 DataModule1.SQLQuery1.SQL.Text:='Select IDManager From SprManager' +
 ' Where Manager = "'+ComboBox4.Text+'"';
 DataModule1.SQLQuery1.Active:=true;
  pr:=DataModule1.SQLQuery1.FieldByName('IDManager').Value;
 
  DataModule1.SQLQuery1.Active:=false;
 DataModule1.SQLQuery1.SQL.Text:='Select IDManager From SprManager' +
 ' Where Manager = "'+ComboBox5.Text+'"';
 DataModule1.SQLQuery1.Active:=true;
  vid:=DataModule1.SQLQuery1.FieldByName('IDManager').Value;
 
 
  today:=Now;
 DataModule1.SQLQuery1.Active:=false;
 DataModule1.SQLQuery1.SQL.Text:='Insert Into Cartridgi (IDModelCartridga, IDMastera, DateRabot, Articul, Numzayavki,'+
 ' IDKlienta, IDMestaRabot, IDManagerPrin, DatePriema, DateVidachi, IDManagerVidal, IdStatusa, Komments) Values (:mymod, :mymas, :mydatr, :myart, :mynumz, '+
 ' :mykl, :mymest, :mypr, :mydatp, :mydatv, :myvid, :mystat, "'+Memo1.Lines.Text+'")';
 
   DataModule1.SQLQuery1.Params.ParamByName('mymod').Value:=IntToStr(md);
   DataModule1.SQLQuery1.Params.ParamByName('mymas').Value:=idus;
   DataModule1.SQLQuery1.Params.ParamByName('mydatr').Value:=today;
   DataModule1.SQLQuery1.Params.ParamByName('myart').Value:=art;
   DataModule1.SQLQuery1.Params.ParamByName('mynumz').Value:=zayav;
   DataModule1.SQLQuery1.Params.ParamByName('mykl').Value:=IntToStr(kl);
   DataModule1.SQLQuery1.Params.ParamByName('mymest').Value:='1';
   DataModule1.SQLQuery1.Params.ParamByName('mypr').Value:=IntToStr(pr);
   DataModule1.SQLQuery1.Params.ParamByName('mydatp').Value:=today;
   DataModule1.SQLQuery1.Params.ParamByName('mydatv').Value:=today;
   DataModule1.SQLQuery1.Params.ParamByName('myvid').Value:=IntToStr(vid);
   DataModule1.SQLQuery1.Params.ParamByName('mystat').Value:='4';
 
 
  DataModule1.SQLQuery1.ExecSQL;
 
 
 
  //заполнение работ в базу из CheckBoxa
     for I:= 0 to CheckListBox1.Items.Count - 1  do  // цикл по CheckListBox1
         begin
          if CheckListBox1.Checked[I] = true then
           begin
               DataModule1.SQLQuery3.Active:=false;
               DataModule1.SQLQuery3.SQL.Text:='SELECT *'+
               ' FROM sprrabot WHERE Rabota ="'+CheckListBox1.Items[i]+'"';
               DataModule1.SQLQuery3.Active:=true;
               idrab:=DataModule1.SQLQuery3.FieldByName('IdRabot').Value;
 
               DataModule1.SQLQuery2.Active:=false;
               DataModule1.SQLQuery2.SQL.Text:='SELECT * FROM cartridg_raboti'+
               ' WHERE cartridg_raboti.IDCartridga = '+ IntToStr(curID)+' AND cartridg_raboti.IDRabot = '+ IntToStr(IDrab);
               DataModule1.SQLQuery2.Active:=true;
 
               if DataModule1.SQLQuery2.RecordCount>0 then
                begin
                end
              else
               begin
 
 
                DataModule1.SQLQuery3.Active:=false;
                DataModule1.SQLQuery3.SQL.Text:='Insert Into Cartridg_Raboti (IDCartridga, IDRabot) Values ('+inttostr(curID)+','+IntToSTR(IDrab)+')';
                DataModule1.SQLQuery3.ExecSQL;
 
               end;
 
 
 
           end
           else
           begin
               DataModule1.SQLQuery3.Active:=false;
               DataModule1.SQLQuery3.SQL.Text:='SELECT *'+
               ' FROM sprrabot WHERE Rabota ="'+CheckListBox1.Items[i]+'"';
               DataModule1.SQLQuery3.Active:=true;
               idrab:=DataModule1.SQLQuery3.FieldByName('IdRabot').Value;
 
               DataModule1.SQLQuery2.Active:=false;
               DataModule1.SQLQuery2.SQL.Text:='SELECT * FROM cartridg_raboti'+
               ' WHERE cartridg_raboti.IDCartridga = '+ IntToStr(curID)+' AND cartridg_raboti.IDRabot = '+ IntToStr(IDrab);
               DataModule1.SQLQuery2.Active:=true;
 
               if DataModule1.SQLQuery2.RecordCount>0 then
                begin
 
                DataModule1.SQLQuery3.Active:=false;
                DataModule1.SQLQuery3.SQL.Text:='DELETE FROM Cartridg_Raboti WHERE IDCartridga='+IntToSTR(curID)+' AND IDRabot='+IntToStr(IDrab);
                DataModule1.SQLQuery3.ExecSQL;
 
                end;
           end;
 
 
 
         end;
end;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.05.2016, 18:01
Ответы с готовыми решениями:

Проблема с транзакцией MySql + dbExpress
Доброго времени суток! В процессе разработки появилась потребность в использовании транзакции,...

С++ Builder (dbExpress) + MySQL
Приветствую всех. Нуждаюсь в помощи. Нужна информация\гайды\книги\etc по компонентам класса...

Помогите с dbexpress и mysql
Я всё настроил и когда хочу поставить SqlConnection.Connected := true(в коде, в настройках - без...

DBExpress+DDL MySQL
Пытаюсь выполнить DDL скрипт создания БД в MySQL через dxExpress, используя метод TSQLConnection...

20
16 / 15 / 4
Регистрация: 30.10.2014
Сообщений: 175
04.05.2016, 20:56 2
Если вопрос такой задаёте, то теорию плохо читали
0
8 / 8 / 7
Регистрация: 01.01.2016
Сообщений: 386
04.05.2016, 21:04  [ТС] 3
Цитата Сообщение от maybeTM Посмотреть сообщение
Если вопрос такой задаёте, то теорию плохо читали
Спасибо, если бы я хорошо знал теорию и практику, то не задавал бы вопросов вообще. Я пока только учусь. Можете тогда мне сказать в чем именно неправильно поставлен мой вопрос?
0
5489 / 4404 / 1076
Регистрация: 29.08.2013
Сообщений: 27,597
Записей в блоге: 3
05.05.2016, 08:44 4
если человек читал, то он знает что и где нужно использовать
обычно только или недоделывает или переделывает

а с вопросами типа
Цитата Сообщение от edsjeka Посмотреть сообщение
Подскажите куда вставлять и что
точно нужно отправлять за учебники

PS а вы даже поленились в поиск посмотреть
Как правильно сделать транзакцию? ADO
http://www.sql.ru/articles/mss... 3ado.shtml
0
8 / 8 / 7
Регистрация: 01.01.2016
Сообщений: 386
06.05.2016, 19:50  [ТС] 5
Цитата Сообщение от qwertehok Посмотреть сообщение
если человек читал, то он знает что и где нужно использовать
обычно только или недоделывает или переделывает
а с вопросами типа
Сообщение от edsjeka
Подскажите куда вставлять и что
точно нужно отправлять за учебники
PS а вы даже поленились в поиск посмотреть
как сделать правильно транзакцию? ADO
http://www.sql.ru/articles/mss... 3ado.shtml
Спасибо конечно за содержательный ответ, может я конечно не такой "зоркий глаз". Но мне вообще-то нужно не в ADO сделать транзакции, такие посты я и сам находил. Мне нужно в dbExpress сделать транзакции и мне не нужно полностью показывать что и куда вставлять, мне нужен пример, как это делается именно в dbExpress, а дальше я уже и сам разберусь.
0
5489 / 4404 / 1076
Регистрация: 29.08.2013
Сообщений: 27,597
Записей в блоге: 3
06.05.2016, 20:34 6
Цитата Сообщение от edsjeka Посмотреть сообщение
Но мне вообще-то нужно не в ADO сделать транзакции
да? а с помощью какой технологии вы подключаетесь к БД?

Цитата Сообщение от edsjeka Посмотреть сообщение
мне не нужно полностью показывать что и куда вставлять
Цитата Сообщение от edsjeka Посмотреть сообщение
мне нужен пример
это как если бы вы сказали что 1 <> 1

Цитата Сообщение от edsjeka Посмотреть сообщение
а дальше я уже и сам разберусь.
в чем? в примере?
я дал вам примеры - там написано как использовать транзакции
0
8 / 8 / 7
Регистрация: 01.01.2016
Сообщений: 386
06.05.2016, 21:19  [ТС] 7
Цитата Сообщение от qwertehok Посмотреть сообщение
я дал вам примеры - там написано как использовать транзакции
Спасибо.

Добавлено через 42 минуты
Цитата Сообщение от qwertehok Посмотреть сообщение
да? а с помощью какой технологии вы подключаетесь к БД?
Я подключаюсь через SQlConnection, это что по вашему одно и тоже, что и ADO?
0
5489 / 4404 / 1076
Регистрация: 29.08.2013
Сообщений: 27,597
Записей в блоге: 3
06.05.2016, 21:30 8
http://www.sql.ru/articles/mss... 3ado.shtml
0
8 / 8 / 7
Регистрация: 01.01.2016
Сообщений: 386
07.05.2016, 20:50  [ТС] 9
А как проверить результат выполнения запроса, чтобы при выполнении запроса подтвердить транзакцию, а при не выполнении откатить?
к примеру такой код:
Delphi
1
2
SQLQuery1.SQL.Text:='Insert Into Baza (Name, Familia) Values ('Иван', 'Сидоров');
SQLQuery1.ExecSQL;
Как сделать проверку того, что вопрос действительно выполнился?
0
5489 / 4404 / 1076
Регистрация: 29.08.2013
Сообщений: 27,597
Записей в блоге: 3
07.05.2016, 21:10 10
Цитата Сообщение от edsjeka Посмотреть сообщение
Как сделать проверку того, что вопрос действительно выполнился?
а вот это правильный вопрос

тут все зависит от СУБД, нужно читать документацию или спросить у того кто уже прочитал
0
8 / 8 / 7
Регистрация: 01.01.2016
Сообщений: 386
07.05.2016, 21:19  [ТС] 11
Цитата Сообщение от qwertehok Посмотреть сообщение
а вот это правильный вопрос
Спасибо за улыбочку.
Я так понимаю, Except - секция обработки ошибок и если поставить после запроса except, то то что нужно делать в случае ошибки (откат, вывод сообщения об ошибке), выводить после этого ключевого слова?

Добавлено через 4 минуты
Delphi
1
2
3
4
5
6
7
SQLQuery1.SQL.Text:='Insert Into Baza (Name, Familia) Values ('Иван', 'Сидоров');
Try
SQLQuery1.ExecSQL;
Except
messageDlg('Error', mtError, [mbOK],0);
SQLConnection1.Rollback;
end;
Как-то так вроде.
0
AxBxC=X
155 / 135 / 58
Регистрация: 27.04.2016
Сообщений: 549
07.05.2016, 22:08 12
Наверное, сначала нужно разобраться в теории. Что такое транзакция, зачем её придумали (зачем-то ведь её придумали?), как управлять транзакцией. В документации обязательно обнаружатся примеры - куда ж без них. И уже потом переходить к экспериментам.
0
8 / 8 / 7
Регистрация: 01.01.2016
Сообщений: 386
07.05.2016, 22:11  [ТС] 13
Цитата Сообщение от harrybook Посмотреть сообщение
Наверное, сначала нужно разобраться в теории. Что такое транзакция, зачем её придумали (зачем-то ведь её придумали?), как управлять транзакцией. И в документации обязательно обнаружатся примеры - куда ж без них.
Наверное, чем и занимаюсь. А как насчет конкретного ответа по моему коду, что не так?
0
AxBxC=X
155 / 135 / 58
Регистрация: 27.04.2016
Сообщений: 549
07.05.2016, 22:19 14
Цитата Сообщение от edsjeka Посмотреть сообщение
А как насчет конкретного ответа по моему коду, что не так?
Вы ведь учитесь. Если всё разжёвывать и выкладывать на блюдечке, учёба накрывается медным тазиком. Стимул изучения матчасти в том, что вам нужно получить результат.
0
8 / 8 / 7
Регистрация: 01.01.2016
Сообщений: 386
07.05.2016, 22:30  [ТС] 15
Цитата Сообщение от harrybook Посмотреть сообщение
Вы ведь учитесь. Если всё разжёвывать и выкладывать на блюдечке, учёба накрывается медным тазиком. Стимул изучения матчасти в том, что вам нужно получить результат.
Я так понимаю, помочь здесь могут только первокурсникам, которые спрашивают как сделать какой-нибудь запрос или значение Edit внести в поле БД, я когда был на таком уровне, целая очередь выстраивалась мне помогать подсказывать и никто не говорил:"Вы ведь учитесь". А когда немного углубляешься и появляются нюансы, все сразу начинают не мешать мне учится.
Теории и примеров именно по транзакциям в SQLConnection почему-то очень мало и очень обрезано, вот примеры: http://delphi.support.uz/index... ema&id=229, http://www.delphimaster.ru/art... ndex3.html.
Может я не там где-то ищу?
0
5489 / 4404 / 1076
Регистрация: 29.08.2013
Сообщений: 27,597
Записей в блоге: 3
08.05.2016, 00:12 16
Цитата Сообщение от edsjeka Посмотреть сообщение
Как-то так вроде.
Rollback чего вы делаете?
где сама транзакция? где подтверждение?

у вас по первой ссылке все написано
оборачиваете запрос транзакцией, запускаете, подтверждаете
и тут нужно вовремя поймать ошибку что бы сделать Rollback
0
8 / 8 / 7
Регистрация: 01.01.2016
Сообщений: 386
08.05.2016, 16:32  [ТС] 17
Цитата Сообщение от qwertehok Посмотреть сообщение
у вас по первой ссылке все написано
оборачиваете запрос транзакцией, запускаете, подтверждаете
и тут нужно вовремя поймать ошибку что бы сделать Rollback
Я все понимаю, но не могу разобраться с синтаксисом именно для SQLConnection. Когда делаю так:
Delphi
1
2
3
4
5
6
7
8
9
 SQLConnection1.StartTransaction;
   try
   SQLQuery1.Active:=false;
   SQLQuery1.SQL.Text:='Insert Into Probatranz Values ("", "Иванов", "Вася")';
   SQLQuery1.ExecSQL;
 
   except
 
   end;
по аналогии с тем что указано в первой ссылке, то StartTransaction при вводе подсвечивается серым а не черным в контекстном меню, а потом при запуске выдает ошибку: [dcc32 Error] Unit1.pas(253): E2035 Not enough actual parameters


А есть еще такой вариант:
Delphi
1
2
3
4
5
6
7
8
 SQLConnection1.BeginTransaction;
   try
   SQLQuery1.Active:=false;
   SQLQuery1.SQL.Text:='Insert Into Probatranz Values ("", "Иванов", "Вася")';
   SQLQuery1.ExecSQL;
   except
 
   end;
Этот вариант запускается без ошибок, но тут я не могу никуда вставить rollback и commit, тут теперь они подсвечиваются серым и выбивается ошибка.
Самое главное я уже сколько роюсь не могу найти ни одного примера как это сделано с SQLConnection, во всех форумах, где возникает такой вопрос все отправляют в гугл и теорию почитать, а вот про ADOConnection примеров полно, но не получается сделать то же самое с SQLConnection.
Хотя бы объясните, что означает, когда функция подсвечивается не черным а серым цветом, бывает, что она вообще не доступна, а тут вроде доступна, но при запуске программы не работает.

Добавлено через 3 часа 14 минут
Нашел! На каком-то англоязычном сайте нашел кусок кода, по которому понял, что нужно делать так:
Нужно некоторой переменной задать тип TTransactionDesc, задать ей параметры транзакции и потом эту переменную использовать как параметр во всех функциях связанных с транзакциями.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var tr: TTransactionDesc;
begin
    tr.IsolationLevel:=xilREPEATABLEREAD;
 
    SQLConnection1.StartTransaction(tr);
   try
   SQLQuery1.Active:=false;
   SQLQuery1.SQL.Text:='Insert Into Probatranz Values ("2", "Иванов", "Вася")';
   SQLQuery1.ExecSQL;
   except
    SQLConnection1.Rollback(tr);
     MessageDlg('ошибка, транзакция не выполнена', mtError, [mbOk],0);
   end;
    SQLConnection1.Commit(tr);
Может кому пригодится. Буду дальше разбираться.
У меня только еще один вопрос, может кто подскажет: функция Except сама проверяет на правильность выполнения запроса или мне еще как-то нужно ее подстраивать? или все что под Except можно считать ошибочным и не париться?
0
AxBxC=X
155 / 135 / 58
Регистрация: 27.04.2016
Сообщений: 549
08.05.2016, 17:38 18
См. "Обработка исключительных ситуаций в Delphi"
Гуглится и яндексится.
0
8 / 8 / 7
Регистрация: 01.01.2016
Сообщений: 386
08.05.2016, 20:13  [ТС] 19
Цитата Сообщение от harrybook Посмотреть сообщение
Гуглится и яндексится.
Стандартный ответ. Чего и следовало ожидать. Спасибо за помощь.
0
AxBxC=X
155 / 135 / 58
Регистрация: 27.04.2016
Сообщений: 549
08.05.2016, 20:49 20
edsjeka,
Пожалуйста!

Не по теме:

Вы ленитесь работать с документацией.
Изучение документации - один из главнейших факторов успешного роста.

0
08.05.2016, 20:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.05.2016, 20:49
Помогаю со студенческими работами здесь

Соединить приложение с СУБД MySQL через компоненту dbExpress
Хочу соединить некое приложение с СУБД MySQL через компоненту dbExpress. MySQL версии...

Бубны Borland C++ XE в составе RADStudio + dbExpress + Mysql сервер версии 5 и выше!
Собственно вопрос в теме, как реализовать коннект в RADStudio-ском Borland C++ через dbExpress к...

Пожалуйста нужно разобраться с запросом Mysql! Одним запросом из двух таблиц / MySQL
У меня на главной странице существует вот такой запрос (он ниже), который вытаскивает из таблицы...

Управление транзакциями в С++
Нужно реализовать управление транзакциями в с++. А именно работу с 2мя структурами в файле.Вопросы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru