Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Базы данных > кеширование в ADO


Автор: Otouto 13.1.2010, 20:00
всем привет.


не мог бы кто нибудь объяснить как организовать кеширование данных в модели ADO.


нужно для:


есть несколько DBEdit-ов.  нужно что бы данные заносились не сразу после записи их в отдельный DBEdit, а после заполнения всей строки таблицы.  Допустим у нас 5 полей в таблице, мы заполняем 5 DBEdit-ов потом жмем кнопку "Добавить"  и вносится новая строка. (ну или редактируется старая, в зависимости от выбора)



я так понял что пока я не нажму кнопку "Добавить" данные должны кешироваться, как это сделать?  знаю что у ADOTable есть свойство CacheSize, но не сильно понял пока как с ним рабоать

Автор: artsb 13.1.2010, 20:36
Здесь кэширование не нужно.
Размещаете на форме обычные Edit'ы.

Заполняете их.
При нажатии на кнопку добавить:
Код

ADOTable1->Insert(); // вставить новую пустую строку
// теперь заполняете поля удобным для вас способом, например
ADOTable1->FieldByName("some_field")->AsString = Edit1->Text;
// и так все поля
ADOTable1->Post(); // записать в БД

При нажатии кнопки изменить, вместо Insert вызываете метод Edit. Остальное также. Единственное, может некоторые поля придётся по-другому заполнять (например, многострочное поле желательно сначала очистить, но это ещё зависит от конкретной ситуации).

Автор: Otouto 13.1.2010, 20:49
угу. этот способ работает.  спасибо


но т.к. это курсак, разобраться надо именно с ДБЭдитом и кешированием,  так что если не сложно напишите несколько слов об этом

Автор: artsb 13.1.2010, 22:02
Тогда можно сделать так:
Завести флаг. И проверять его в событии BeforPost. Взводить флаг только после нажатия кнопки "Сохранить" или "Добавить".
Код

bool flag = false;
// ...
void __fastcall TForm1::ADOTable1BeforePost(TDataSet *DataSet)
{
if(!flag) {
 ADOTable1->Cancel();
 return; 
}
flag = false;
}
// клик на кнопке "Сохранить"
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 // проверка правильности данных
 // заполнение полей
 flag = true;
 ADOTable1->Post();
}
// клик на кнопке "Добавить"
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 // проверка правильности данных
 ADOTable1->Insert();
 // заполнение полей
 flag = true;
 ADOTable1->Post();
}

Что-то типа такого...

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