Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.03.2010, 16:46
Аватар для serhak
serhak serhak вне форума
Прохожий
 
Регистрация: 23.03.2010
Сообщения: 11
Репутация: 12
По умолчанию Delphi+MySQL+SQLConnection

Доброго времени суток уважаемые эксперты и мастера Delphi. Ситуация такая, хочу редактировать данные в DBGrid. Сервер MySQL, использую связку компонентов SQLConnection+SimpleDataSet+DataSource+DBGrid, всё отображается таблицу вижу, но при изменении значений, они не сохраняются на сервере. Пробовал связки SQLConnection+SQLDataSet+DataSetProvider+ClientDat aSet+DataSource+DBGrid и SQLConnection+SQLTable+DataSetProvider+ClientDataS et+DataSource+DBGrid. Во всех компонентах свойство ReadOnly:=false(по умолчанию). Методы ClientDataSet.ApplyUpdates(0) и SimpleDataSet.ApplyUpdates(0) ни к чему хорошему не приводят, либо проходят без ошибок, но изменения на сервер не доходят, либо заканчиваются ошибками типа "DataSet is read-only". Код приводить не буду, т.к. и нет его почти, всё описано выше. Может быть какое-то свойство нужно задать или выполнять какой-нить SQL запрос при изменении в ячейке. ADO использовать не хочется.
Ответить с цитированием
  #2  
Старый 23.03.2010, 18:00
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Там были разные хитрости. Как я понимаю, ты пытаешься использовать MIDAS (т.к. есть TDatasetProvider). Тут штука такая.
1. MIDAS автомтически коммитит транзации, так что компоненты должны это понимать. Например, со штатными IBX не получается работать через MIDAS, мне пришлось для этого перейти на FIB.
2. Для корректной работы там надо указать способ определения нужной записи. Обычно, я указываю что-то типа ByKey (не могу сейчас точно посмотреть) и для первичного ключа у соотв. поля ставлю флажок. Поищти в гугле - там есть пара статей, которые это хорошо описывают.
Ответить с цитированием
  #3  
Старый 23.03.2010, 18:00
Аватар для TOJluK
TOJluK TOJluK вне форума
Местный
 
Регистрация: 25.02.2009
Адрес: Минск
Сообщения: 551
Версия Delphi: 2007
Репутация: 110
По умолчанию

А commit вызываете?
Ответить с цитированием
  #4  
Старый 23.03.2010, 18:05
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Если это MIDAS, то он сам там коммиты вызывает. И даже лишние иногда
Ответить с цитированием
  #5  
Старый 23.03.2010, 18:31
Аватар для serhak
serhak serhak вне форума
Прохожий
 
Регистрация: 23.03.2010
Сообщения: 11
Репутация: 12
По умолчанию

commit не вызываю (если можно, то поподробнее про commit, с чем их едят), FIB DAC - я так понимаю сторонний компонент, судя по инфе из гугла для доступа к БД Firebird, мне тогда нужен MyDAC для MySQL, но хотелось бы сделать всё стандартными средствами и без ADO.

Последний раз редактировалось serhak, 23.03.2010 в 18:54.
Ответить с цитированием
  #6  
Старый 24.03.2010, 09:52
Аватар для TOJluK
TOJluK TOJluK вне форума
Местный
 
Регистрация: 25.02.2009
Адрес: Минск
Сообщения: 551
Версия Delphi: 2007
Репутация: 110
По умолчанию

Даже не знаю с чего начать. Для работы с базой используются транзакции, которые позволяют подтвердить или отменить изменения в базе. Т.е. когда вы вызываете в рамках транзакции commit вы отправляете данные в базу, rollback- соответственно не отправляете. Для interbase есть готовый компонент IBTransaction. Наберите SQLConnection.Commit и почитайте хэлп, там есть пример того как организовать транзакцию.

Цитата:
Сообщение от lmikle
Если это MIDAS, то он сам там коммиты вызывает. И даже лишние иногда
Это, как я понимаю, сразу после Post? Там же есть ResolveToDataSet его, как я понял, надо в True выставить чтобы апдейтить, так?

Последний раз редактировалось TOJluK, 24.03.2010 в 10:01.
Ответить с цитированием
  #7  
Старый 26.03.2010, 23:50
Аватар для serhak
serhak serhak вне форума
Прохожий
 
Регистрация: 23.03.2010
Сообщения: 11
Репутация: 12
По умолчанию

Почитал немного про транзакции. Делаю так:
Объявляю переменную TransMySql: TTransactionDesc;
Присваиваю id данной транзакции TransMySQL.TransactionID:=1;
Затем запускаю транзакцию с параметром SQLConnection1.StartTransaction(TransMySQL);
Затем делаем в DBGrid какие-либо изменения и вызываем SQLConnection1.Commit(TransMySQL);
Но изменения не сохраняются. Метод ClientDataSet2.ApplyUpdates(-1); вызывает ошибку(вызываю перед Commit).
Может я что-то делаю неправильно? И обязательно ли вызывать ApplyUpdates?
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:06.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter