Мы с вами использовали CAccessor. Использовали его потому что, структура данных была уже известна. А вот если она будет не известна, то мы должны будем использовать CDynamicAccessor. Мы создадим Win32 console приложение, дабы не загромождаться кодом. Смотрите код. Он прокомментирован, да и прошлые шаги есть. Мы все повторим за AppWizard, только будем использовать CDynamicAccessor.
#include "stdafx.h"
#include "afxwin.h"
#include "afxoledb.h" // классы OLEDB шаблонов
#include "iostream.h"
void main(int argc, char* argv[])
{
CoInitialize(NULL); // инициализация COM
CDataSource db;
CSession session;
// связь
CCommand dinamic;
HRESULT hr;
// настрока свойств
CDBPropSet dbinit(DBPROPSET_DBINIT);
dbinit.AddProperty(DBPROP_AUTH_CACHE_AUTHINFO, true);
dbinit.AddProperty(DBPROP_AUTH_ENCRYPT_PASSWORD, false);
dbinit.AddProperty(DBPROP_AUTH_MASK_PASSWORD, false);
dbinit.AddProperty(DBPROP_AUTH_PASSWORD, "");
dbinit.AddProperty(DBPROP_AUTH_PERSIST_ENCRYPTED, false);
dbinit.AddProperty(DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO, false);
dbinit.AddProperty(DBPROP_AUTH_USERID, "Admin");
dbinit.AddProperty(DBPROP_INIT_DATASOURCE,
"C:\\MSDASDK\\bin\\oledb\\Nwind.mdb");
dbinit.AddProperty(DBPROP_INIT_MODE, (long)16);
dbinit.AddProperty(DBPROP_INIT_PROMPT, (short)4);
dbinit.AddProperty(DBPROP_INIT_PROVIDERSTRING,
";COUNTRY=0;CP=1252;LANGID=0x0409");
dbinit.AddProperty(DBPROP_INIT_LCID, (long)1033);
// инициализация
hr = db.OpenWithServiceComponents("Microsoft.Jet.OLEDB.3.51", &dbinit);
if (FAILED(hr))
{
cout << "Error dc.Open" << endl;
return;
}
// создаем сессию
hr = session.Open(db);
if (FAILED(hr))
{
cout << "Error session.Open" << endl;
return;
}
// настройка свойств
CDBPropSet propset(DBPROPSET_ROWSET);
propset.AddProperty(DBPROP_CANFETCHBACKWARDS, true);
propset.AddProperty(DBPROP_IRowsetChange, true);
propset.AddProperty(DBPROP_UPDATABILITY, DBPROPVAL_UP_CHANGE);
// открываем
dinamic.Open(session,"SELECT * FROM Categories",&propset);
// количество колонок
cout << dinamic.GetColumnCount() << endl;
// инфорация о колонках
for (unsigned int x=0; x < dinamic.GetColumnCount();x++)
{
// получить имя
LPOLESTR lp=NULL;
lp=dinamic.GetColumnName(x); // получим OLECHAR
if (lp!=NULL) // если не NULL
{
char chars[255];
wcstombs((CHAR*)&chars,(OLECHAR*)lp,sizeof(chars));
cout << chars << endl;
}
}
}
В результате мы сможем просмотреть название полей.
