![]() |
![]() |
|
![]() |
||||||||||||||||||
![]() |
![]() |
![]() |
||||||||||||||||
|
![]() |
|
![]() |
|
||||||||||||||
![]() |
![]() |
20 - Что сделал AppWizard / OLE DB / Visual C++ |
![]() |
Шаг 20 - Что сделал AppWizardВ прошлом шаге мы посмотрели как используя 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. | | Автор Каев Артем. |
![]() |
![]() |
![]() |
|