Шаг 6 - Продолжаем открывать Recordset

Вот полное описание функции Open:

virtual BOOL Open( UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE,
	LPCTSTR lpszSQL = NULL, DWORD dwOptions = none );
throw( CDBException, CMemoryException );

Как видите при открытии набора записей есть несколько типов:

CRecordset::dynaset   
CRecordset::snapshot   
CRecordset::dynamic   
CRecordset::forwardOnly   

snapshot - набор записей типа моментального снимка (Snapshot-type Recordset). Набор записей статического типа или, другими словами, типа моментального снимка (Snapshot-type Recordset) содержит копию данных, которую нельзя изменять. Этот тип набора записей удобно использовать для поиска записи, удовлетворяющей какому-либо критерию, или при генерации отчетов. Следует помнить, что при использовании этого набора записей содержимое всех полей заносится в память, что может потребовать значительных ресурсов памяти.

Смотрим как это сделать:

void CDatebaseDlg::OnOpen() 
{ 
	CDatabase cdbMyDB;
	cdbMyDB.OpenEx("DSN=123");
	if (cdbMyDB.IsOpen()) 
	{
		CRecordset cr(&cdbMyDB);
		try
		{
	   		cr.Open(CRecordset::snapshot,
				"SELECT Family FROM TABLE1", CRecordset::readOnly );
			if (cr.IsOpen()) AfxMessageBox("Open");
  		         cr.Close(); 
		}
		catch(CDBException cdb)
		{
			AfxMessageBox(cdb.m_strStateNativeOrigin);
		}
	}
	else  AfxMessageBox("Not Open");
	cdbMyDB.Close();
}

Для связи с базой данных мы применили новую функцию OpenEx. Она сразу открывает и инициализирует связь с базой данных и рекомендована к использованию. В ней я указал драйвер в формате DNS=name.

И выделенное жирным открытие набора строк. Этот набор строк можно проверить открытием небезызвестной IsOpеn. Этот код защищен от ошибок. Например при ошибочном SQL операторе типа SELECT Family FROM TABLEw1 вы получите сообщение:

6_1.gif (4030 b)

То есть Вы спокойно взяв этот код за основу можете создать строку ввода SQL и дать пользователю сформировать запрос, который Вы отобразите. Если он ошибется, ничего страшного не будет.

Этот код можно сократить и он будет работать !!!

void CDatebaseDlg::OnOpen() 
{ 
	CRecordset cr(NULL);
	try
	{
		cr.Open(CRecordset::snapshot,
			"SELECT Family FROM TABLE1", CRecordset::readOnly ); 
		if (cr.IsOpen()) AfxMessageBox("Open");
			cr.Close(); 
	}
	catch(CDBException cdb)
	{
		AfxMessageBox(cdb.m_strStateNativeOrigin);
	}
}

Как видите, в указание драйвера я поставил NULL. Что будет ? ODBC спросит Вас какой. Вот так:

6_2.gif (7938 b)


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