![]() |
![]() |
|
![]() |
||||||||||||||||||
![]() |
![]() |
![]() |
||||||||||||||||
|
![]() |
|
![]() |
|
||||||||||||||
![]() |
![]() |
16 - Работаем с CDaoRecordset / DAO / Visual C++ |
![]() |
Шаг 16 - Работаем с CDaoRecordsetВсе говорят, что 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() в данном случае, чтобы перейти на вторую записью. Ну, вот и все. Работайте пожалуйста, ходите вперед назад как захотите... | | Автор Каев Артем. |
![]() |
![]() |
![]() |
|