Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > TDBGrid


Автор: RomaKiev 6.4.2011, 23:15
Доброго времени суток!

В приложении имеется таблица, созданная с помощью компонента TDBGrid В эту таблицу заносятся данные из базы данных MySQL Я написал процедуру для обновления базы данных на основании изменений, внесённых непосредственно в таблицу. Эта процедура вызывается при нажатии кнопки. 

Но проблема вся в том,  что изменения внесённые в таблицу сразу же сохраняются в базе данных.  То есть, нажимаю я кнопку или нет, база данных всё равно обновляется. Хотелось бы чтобы это происходило только при нажатии кнопки. Может кто-нибудь знает с чем это может быть связано? Может есть какие-то свойства компонента TDBGrid или TMyQuery, которые влияют на сохранения данных в БД?

 

Автор: ZVano 7.4.2011, 10:54
Вероятно, нужно использовать режим кешированых изменений.
У набора данных свойство CachedUpdates = true.

Общий алгоритм работы:
1. Загружаем данные в набор данных.
2. Редактируем их ()
Код

myDataSet->Edit();
myDataSet->FieldByName("myFieldName")->AsString = "данные";
//...

3. По клику "Сохранить" пробегаемся по набору данных и выполняем запросы к БД.
3.1 Провряем были или нет изменения
if (!myDataSet->Modified){
  //изменений не было
  return;
}
...
3.2 Выполняем изменения
Код

myDataSet->First();
while(!myDataSet->Eof()){
  // Проверяем статус записи
  //...

  myDataSet->Next();
}

3.3 Переоткрываем набор данных
myDataSet->CancelUpdates();
myDataSet->Close();
myDataSet->Open();


Должен быть более правильный способ. Но этот тоже работает.

Автор: _Dimon_ 8.4.2011, 01:41
Цитата(ZVano @  7.4.2011,  10:54 Найти цитируемый пост)
Должен быть более правильный способ. Но этот тоже работает.


Желательно использовать транзакции.

Автор: ZVano 8.4.2011, 09:13
Цитата(_Dimon_ @  8.4.2011,  01:41 Найти цитируемый пост)
Желательно использовать транзакци

Это понятно - транзакции необходимая часть для любого приложения, которое работает с БД.
 Но я имел ввиду способ, при котором изменения ложатся в БД при вызове метода ApplyUpdates.
В таком случае не нужно никаких циклов, проверок и т.д. Компоненті сами знают что делать.
Если не ошибаюсь: В ADO это автоматом работает (система ищет записи по совокупности полей); В IBX нужно сгенерировать шаблоны SQL-запросов в компоненте TIBDataset, либо  TIBUpdateSql.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)