В прошлом шаге мы посмотрели как используя AppWizard создавать приложение с OLEDB. Давайте посмотрим, что этот Wizard нам наделал. Первое что Вы увидите это некоторое количество новый классов.
Смотрим класс CCategories. Этот класс аналогия созданной нами таблицы. Посмотрите последнее окно в прошлом шаге.
class CCategories { public: CCategories() { memset( (void*)this, 0, sizeof(*this) ); }; int m_CategoryID; char m_CategoryName[16]; char m_Description[1025]; ISequentialStream* m_Picture; BEGIN_COLUMN_MAP(CCategories) COLUMN_ENTRY_TYPE(1, DBTYPE_I4, m_CategoryID) COLUMN_ENTRY_TYPE(2, DBTYPE_STR, m_CategoryName) COLUMN_ENTRY_TYPE(3, DBTYPE_STR, m_Description) BLOB_ENTRY(4, IID_ISequentialStream, STGM_READ, m_Picture) END_COLUMN_MAP() };
Как видите этот класс, описывает все поля, которые присутствовали в таблице. AppWizard сам нашел им аналоги в C++ и создал переменные члены классов. Второй созданный класс CTestTemplateSet.
class CTestTemplateSet : public CCommand<CAccessor<CCategories> > { ...... }
Посмотрите он является наследником класс CCommand который включает наш класс CCategories. Все здесь проще так как структуры данных известна на этапе проектирования. Так же Wizard перегрузил функцию Open.
HRESULT Open() { CDataSource db; CSession session; HRESULT hr; CDBPropSet dbinit(DBPROPSET_DBINIT); dbinit.AddProperty(DBPROP_AUTH_CACHE_AUTHINFO, true); ...... }
Помните по предыдущим шагам чего нам это стоило? В начале заполняются свойства, которые были установлены в диалоговом режиме при проектировании. Вы сможете их увидеть на рисунке в прошлом шаге.
...... 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);
На основе нее открывается сессия.
hr = session.Open(db);
Дальше устанавливаются свойства сессии.
CDBPropSet propset(DBPROPSET_ROWSET); propset.AddProperty(DBPROP_CANFETCHBACKWARDS, true); propset.AddProperty(DBPROP_IRowsetScroll, true); propset.AddProperty(DBPROP_IRowsetChange, true); propset.AddProperty(DBPROP_UPDATABILITY, DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_INSERT | DBPROPVAL_UP_DELETE );
И выполняется команда по выбору данных.
hr = CCommand<CAccessor<CCategories> >::Open(session, "SELECT * FROM Categories", &propset);
Все это нам знакомо по прошлым шагам, только проще реализуется. Кстати как Вы видите после генерации этого кода у Вас есть возможность, что то подправить. Например, изменить запрос SQL.