Шаг 160 - Заполняем список из БД

Задача такая. Создать простое приложение на основе диалоговой панели с окном списка, которое заполнится из файла БД. За основу возьмем базу данных Access и механизм DAO. В базе данных будет одна таблица с именем test. Эта таблица взята из реального проекта поэтому там первое поле ключевое, второе фамилия (family), а третье отчество. Не надо критики. Идет разговор о базе данных по материалам работ 1868-2000 года. Так вот в геологических отчетах младше 1950 годов отчество уже не восстановишь. Вот поэтому-то и поля совмещенные.

Создавайте приложение на базе диалогового окна и помещайте на него элемент управления список. К этому элементу управления нужно добавить переменную типа Control, чтобы можно было с ней работатб. Вот так.

class CTestBaseDlg : public CDialog
{
......
	enum { IDD = IDD_TESTBASE_DIALOG };
	CListBox	m_ListBox;
.....
};

Список будет заполняться при запуске диалоговой панели и поэтому наиболее удобно его заполнить в функции OnInitDialog().

BOOL CTestBaseDlg::OnInitDialog()
{
	..........
	// TODO: Add extra initialization here
	ListFullDao();

	return TRUE;  // return TRUE  unless you set the focus to a control
}

Всё заполнение я решил вынести в отдельную функцию дабы не загромождать инициализацию. А вот и она.

void CTestBaseDlg::ListFullDao()
{
	AfxDaoInit();
	CDaoWorkspace cw;
	CDaoDatabase cd(&cw);
	CDaoTableDef cf(&cd);
	CDaoRecordset cr;
	cw.Open();
	if (cw.IsOpen())
	{
		
			cd.Open("d:\\TestDB\\test.mdb");
			if (cd.IsOpen())
			{
			
				cf.Open("test");
				if (cd.IsOpen())
				{
					
					cr.Open(&cf);
					while (!cr.IsEOF())
					{
						COleVariant val;
						cr.GetFieldValue("family",val); 
						char buf[256];
						sprintf(buf,"%s",val.bstrVal);
						m_ListBox.AddString(buf);
						cr.MoveNext(); 
					}
				}
				else AfxMessageBox("Error Open Table");
			}
			else AfxMessageBox("Error Open File");

	}
	else AfxMessageBox("Not Open WorkSpace");
	cr.Close(); 
	cf.Close();
	cd.Close();
	cw.Close(); 
	AfxDaoTerm();
}
Итак, как видите все тривиально. Инициализируем DAO функцией AfxDaoInit(), открываем рабочее пространство CDaoWorkspace это просто имя области работы можно оставить NULL. Дальше открываем саму базу CDaoDatabase, из базы открываем таблицу CDaoTableDef, на основе которой делаем набор записей CDaoRecordset постоянно проверяя на корректность функцией IsOpen(). После открытия записей мы можем бежать по записям используя MoveNext(), когда дойдем до конца получим IsEOF.

Немного сложнее с получением самого значения. Для этого используя функцию GetFieldValue и имя поля (можно его номер) получаем содержимое в переменную COleVariant. Чтобы в поле не находилось оно поместится туда. Такая переменная хорошая. Так как тип её я знаю, то и извлеку её в строку. Вот.

Давайте протестируем. Только не забудьте указать Ваш путь к БД.

160_1.gif (2235 b)

Вы видите эту фамилию (Бунге). Этот мужик в 1886 году от Российской Академии Наук изучал Новосибирские острова.


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 21.03.2000