|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
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
|
|||
|
|||
Там были разные хитрости. Как я понимаю, ты пытаешься использовать MIDAS (т.к. есть TDatasetProvider). Тут штука такая.
1. MIDAS автомтически коммитит транзации, так что компоненты должны это понимать. Например, со штатными IBX не получается работать через MIDAS, мне пришлось для этого перейти на FIB. 2. Для корректной работы там надо указать способ определения нужной записи. Обычно, я указываю что-то типа ByKey (не могу сейчас точно посмотреть) и для первичного ключа у соотв. поля ставлю флажок. Поищти в гугле - там есть пара статей, которые это хорошо описывают. |
#3
|
||||
|
||||
А commit вызываете?
|
#4
|
|||
|
|||
Если это MIDAS, то он сам там коммиты вызывает. И даже лишние иногда
|
#5
|
||||
|
||||
commit не вызываю (если можно, то поподробнее про commit, с чем их едят), FIB DAC - я так понимаю сторонний компонент, судя по инфе из гугла для доступа к БД Firebird, мне тогда нужен MyDAC для MySQL, но хотелось бы сделать всё стандартными средствами и без ADO.
Последний раз редактировалось serhak, 23.03.2010 в 18:54. |
#6
|
||||
|
||||
Даже не знаю с чего начать. Для работы с базой используются транзакции, которые позволяют подтвердить или отменить изменения в базе. Т.е. когда вы вызываете в рамках транзакции commit вы отправляете данные в базу, rollback- соответственно не отправляете. Для interbase есть готовый компонент IBTransaction. Наберите SQLConnection.Commit и почитайте хэлп, там есть пример того как организовать транзакцию.
Цитата:
Последний раз редактировалось TOJluK, 24.03.2010 в 10:01. |
#7
|
||||
|
||||
Почитал немного про транзакции. Делаю так:
Объявляю переменную TransMySql: TTransactionDesc; Присваиваю id данной транзакции TransMySQL.TransactionID:=1; Затем запускаю транзакцию с параметром SQLConnection1.StartTransaction(TransMySQL); Затем делаем в DBGrid какие-либо изменения и вызываем SQLConnection1.Commit(TransMySQL); Но изменения не сохраняются. Метод ClientDataSet2.ApplyUpdates(-1); вызывает ошибку(вызываю перед Commit). Может я что-то делаю неправильно? И обязательно ли вызывать ApplyUpdates? |