Во первых мы подправим имя функции void SetRecorset(CDaoRecordset* m_pSet); просто ошибка вышла на SetRecordset. Проблем здесь нет просто в двух местах.
Есть более значительная поправка. По первых давайте разберемся как редактируются записи. Вот схема.
Набор записей может быть открыт только для чтения, а мы будем с Вами пытаться писать и как результат ошибки. Вот мы и изменим нашу функцию SaveData предусматривая данную ситуацию.
void CDaoDialog::SaveData() { if (!(m_pRecordset->IsEOF())) { if (m_pRecordset->CanUpdate()) // если разрешено обновление { m_pRecordset->Edit(); UpdateData(TRUE); m_pRecordset->Update(); } } }
Но и это еще не все. Дело в том, что мы автоматически сохраняем все поля, которым есть аналоги на диалоге. Это так. Но а вдруг мы не все поля будет отображать на диалоге например идентификаторы а хотим их обновлять? Или просто хотим изменить записи в обход DDX из элементов. Надо дать возможность перед тем как записи будут изменены что-то сделать пользователю. Вот мы и создадим виртуальную функцию OnSave. Это будет виртуальная функция, которую можно в любой момент перегрузить и вписать в нее свой особенный код сохранения.
class CDaoDialog : public CDialog { // Construction public: virtual void OnSave(); void Last(); ...... } void CDaoDialog::OnSave() { }
И будет вызывать эту функцию при вызове Save после DDX.
void CDaoDialog::SaveData() { if (!(m_pRecordset->IsEOF())) { if (m_pRecordset->CanUpdate()) // если разрешено обновление { m_pRecordset->Edit(); UpdateData(TRUE); OnSave(); // для будущих классов m_pRecordset->Update(); } } }
В проекте находится класс CDaoDialog упакованный для использования в Component Gallery как ogx файл.