Мы с вами использовали 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; // связь CCommanddinamic; 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; } } }
В результате мы сможем просмотреть название полей.