В прошлом шаге мы посмотрели как используя 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.