Все говорят, что VB для DB это вообще. VC для DB это тоже нормально. Вы наверно видели во многих книгах начинается работа с DB, как легко просматривать записи ??? Ну, мол, вперед назад и так далее. Давайте сделаем примерно такой же проект на основе диалогового окна.
Помещаем две кнопки и элемент редактирования, который связываем с переменной m_Name. Добавляем в описание класса диалогового окна классы баз данных, незабыв объявить ссылку на DAO:
#include "afxdao.h" ///////////////////////// // CTestDBDlg dialog class CTestDBDlg : public CDialog { // Construction public: CDaoRecordset* cDaoRset; CDaoDatabase cDaoDB; CTestDBDlg(CWnd* pParent = NULL); // standard constructor // Dialog Data //{{AFX_DATA(CTestDBDlg) enum { IDD = IDD_TESTDB_DIALOG }; CString m_Name; //}}AFX_DATA ...... };
Теперь при запуске диалогового окна нам нужно настроить объекты базы данных и получить набор записей.
BOOL CTestDBDlg::OnInitDialog() { CDialog::OnInitDialog(); ...... // TODO: Add extra initialization here cDaoDB.Open("c:/vb/step/step.mdb"); if (!cDaoDB.IsOpen()) return FALSE; cDaoRset = new CDaoRecordset(&cDaoDB); cDaoRset->Open( AFX_DAO_USE_DEFAULT_TYPE,"SELECT * FROM TABLE1"); cDaoRset->MoveFirst(); COleVariant CValue; cDaoRset->GetFieldValue("Name",CValue); m_Name=CValue.pbVal; UpdateData(FALSE); return TRUE; // return TRUE unless you set the focus to a control }
Но раз есть динамические объекты их нужно и удалять:
void CTestDBDlg::PostNcDestroy() { delete cDaoRset; cDaoDB.Close(); CDialog::PostNcDestroy(); }
Код кнопок:
void CTestDBDlg::OnLeft() { try { if (cDaoRset->IsBOF()) AfxMessageBox("eof"); else { if (cDaoRset->IsEOF()) cDaoRset->MovePrev(); cDaoRset->MovePrev(); COleVariant CValue; cDaoRset->GetFieldValue("Name",CValue); m_Name=CValue.pbVal; UpdateData(FALSE); } } catch(...) { } } void CTestDBDlg::OnRigth() { try { if (cDaoRset->IsEOF()) AfxMessageBox("eof"); else { if (cDaoRset->IsBOF()) cDaoRset->MoveNext(); cDaoRset->MoveNext(); COleVariant CValue; cDaoRset->GetFieldValue("Name",CValue); m_Name=CValue.pbVal; UpdateData(FALSE); } } catch(...) { } }
Обратите внимание на то, что я делал вот такие вещи:
if (cDaoRset->IsBOF()) cDaoRset->MoveNext(); cDaoRset->MoveNext();
Это связано с тем, что когда курсор уходит за последнею запись нужно два раза вызывать метод MoveNext() в данном случае, чтобы перейти на вторую записью. Ну, вот и все. Работайте пожалуйста, ходите вперед назад как захотите...