Использование ODBC в Visual C++ - Продолжаем открывать Recordset

ОГЛАВЛЕНИЕ

Продолжаем открывать 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 и дать пользователю сформировать запрос, который Вы отобразите. Если он ошибется, ничего страшного не будет.

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

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.