Шаг 16 - Работаем с CDaoRecordset

Все говорят, что VB для DB это вообще. VC для DB это тоже нормально. Вы наверно видели во многих книгах начинается работа с DB, как легко просматривать записи ??? Ну, мол, вперед назад и так далее. Давайте сделаем примерно такой же проект на основе диалогового окна.

16_1.gif (2753 b)

Помещаем две кнопки и элемент редактирования, который связываем с переменной 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() в данном случае, чтобы перейти на вторую записью. Ну, вот и все. Работайте пожалуйста, ходите вперед назад как захотите...


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 10.03.2001