TN054: Вызов DAO непосредственно во время использования классов MFC DAO

При использовании базы данных классов MFC DAO, могут существовать ситуации, когда нужно использовать DAO напрямую. Обычно это будет так, но MFC предоставляет некоторые вспомогательных механизмов для облегчения сделать прямые вызовы DAO простой при сочетании использования классов MFC с прямых вызовов DAO. Прямой DAO вызовы методов управления MFC DAO объекта должно потребоваться всего несколько строк кода. Если необходимо создавать и использовать объекты DAO не управляет MFC, вам будет нужно сделать немного больше работы, вызвав на самом деле релиз на объекте. Эта техническая записка объясняет, когда вы можете напрямую вызывать DAO, что MFC помощники могут сделать, чтобы помочь вам и как использовать интерфейсы DAO OLE. И наконец эта записка содержит некоторые функции образец показывает, как вызвать DAO непосредственно для функций безопасности DAO.

Когда звонить непосредственно DAO

Наиболее распространенные ситуации для принятия прямых вызовов DAO происходит когда коллекции нужно обновить или когда при реализации функций не окружены MFC. Наиболее существенной особенностью, не предоставляемые MFC — безопасность. Если вы хотите реализовать функции безопасности, необходимо будет использовать непосредственно объекты DAO пользователей и групп. Кроме безопасности существует лишь несколько других DAO функций не поддерживается в MFC. К ним относятся возможности репликации записей клонирования и базы данных, а также несколько поздно дополнений к Дао.

Краткий обзор DAO и реализации MFC

Перенос MFC DAO, делают с использованием DAO легче путем обработки многие детали, так что вам не придется беспокоиться об мелочи. Это включает инициализации OLE, создание и управление объектами DAO (особенно объекты коллекции), ошибок, проверка и строгим, простой интерфейс (не вариант или BSTR аргументов). Вы можете сделать прямые звонки DAO и воспользоваться этими функциями. Все, ваш код должен сделать это вызывать метод Release для любых объектов, созданных посредством прямых вызовов Дао и не изменяет никакие из указателей интерфейса, использующих MFC могут внутренне. К примеру изменять не следует m_pDAORecordset член открытый объект CDaoRecordset если вы понимаете все внутренние последствия. Можно однако, используется интерфейс m_pDAORecordset для вызова DAO непосредственно для получения коллекции Fields. В этом случае не следует изменять m_pDAORecordset член. Вам просто нужно вызывать метод Release на объект коллекции полей при завершении работы с объектом.

Описание помощников сделать DAO называет легче

Помощники для вызовов DAO легче являются же помощники, которые используются внутренне в классах MFC DAO базы данных. Эти помощники используются для проверки кодов возврата при вызове прямого DAO, ведение журнала отладки, проверка ожидаемых ошибок и создание надлежащих исключений при необходимости. Существует две основные вспомогательные функции и четыре макросы, которые сопоставляются с одной из этих двух помощников. Наилучшее объяснение было бы просто читать код. Смотрите DAO_CHECK, DAO_CHECK_ERROR, DAO_CHECK_MEMи DAO_TRACE в AFXDAO.H чтобы увидеть макросы и AfxDaoCheck и AfxDaoTrace в DAOCORE.НПК.

Использование интерфейсов DAO OLE

Интерфейсы OLE для каждого объекта в иерархии объектов DAO определены в заголовочном файле DBDAOINT.H, который находится в каталоге \Program Files\DevStudio\VC\include. Эти интерфейсы предоставляют методы, которые позволяют вам манипулировать всей иерархии DAO.

Для многих методов интерфейсов DAO необходимо будет управлять объектом BSTR (длина префикса строка используется в автоматизации OLE). Обычно объект BSTR инкапсулируются в тип данных VARIANT . MFC COleVariant сам наследует от тип данных VARIANT . В зависимости от того, ли вы строите свой проект для ANSI или Unicode интерфейсов DAO возвращает ANSI или Юникод с BSTR. Два макросы, V_BSTR и V_BSTRT, являются полезными для обеспечения интерфейса DAO получает BSTR ожидаемый тип.

V_BSTR будет извлекать bstrVal член COleVariant. Этот макрос обычно используется, когда необходимо передать в метод интерфейса DAO содержимого COleVariant . В следующем фрагменте кода показано, как декларации, так и фактического использования для два метода интерфейса DAO DAOUser, которые используют макрос V_BSTR:

COleVariant varOldName;
COleVariant varNewName (_T("NewUser"), VT_BSTRT);

/ / Код для присвоения pUser допустимое значение пропущено
DAOUser * pUser = NULL;

/ / Эти объявления методов, были взяты из DBDAOINT.H
/ / STDMETHOD(get_Name) (авторскими BSTR FAR * pbstr) PURE;
/ / STDMETHOD(put_Name) (авторскими BSTR bstr) PURE;

DAO_CHECK (pUser-gt; get_Name (& V_BSTR (и varOldName)));
DAO_CHECK (pUser - > put_Name (V_BSTR (и varNewName)))

Обратите внимание, что аргумент VT_BSTRT , указанным в конструкторе COleVariant выше гарантирует, что будет ANSI BSTR в COleVariant если вы строите ANSI-версия Uunicode BSTR и приложения для Юникода версии вашего приложения. Это то, что ожидает DAO.

Макрос V_BSTRT, будет извлекать ANSI или Unicode bstrVal член COleVariant в зависимости от типа сборки (ANSI или Юникод). В следующем коде показано, как извлечь значение BSTR из COleVariant в CString:

COleV&ariant varName (_T ("MyName"), VT_BSTRT);
CString str = V_BSTRT (amp; varName)

Макрос V_BSTRT , наряду с другими приемами взломать открыть другие типы хранимых в COleVariant, показано в примере DAOVIEW, на компакт-диске Visual C++. В частности этот перевод выполняется в методе CCrack::strVARIANT . Этот метод, когда это возможно, переводит значение COleVariant в экземпляр CString.

Простой пример непосредственного вызова DAO

Могут возникать ситуации, когда это необходимо для обновления базовой коллекции объектов DAO. Обычно это не должно быть необходимым, но это простая процедура, если это необходимо. Одним из примеров когда коллекция может потребоваться обновить — при работе в многопользовательской среде с несколькими пользователями, создание новых tabledefs. В этом случае tabledefs коллекции может стать устаревшей. Чтобы обновить коллекции, нужно просто вызвать метод Refresh объекта конкретной коллекции и проверить на наличие ошибок:

DAO_CHECK (pMyDaoDatabase-gt;
    m_pDAOTableDefs - > Обновить ())

Обратите внимание, что в настоящее время все интерфейсы объектов DAO коллекции деталей без документов реализации классов MFC DAO базы данных.

С помощью DAO непосредственно для функций безопасности DAO

Классы баз данных MFC DAO не заключайте функции безопасности DAO. Необходимо вызвать методы интерфейсов DAO для использования некоторых функций безопасности DAO. Следующая функция устанавливает системной базы данных и затем изменяет пароль пользователя. Эта функция вызывает три функции, которые впоследствии определяются.

void ChangeUserPassword( )
{
   // Specify path to the Microsoft Access
   // system database
   CString strSystemDB = 
     _T( "c:\\Program Files\\MSOffice\\access\\System.mdw" );

   // Set system database before MFC initilizes DAO
   // NOTE: An MFC module uses only one instance 
   // of a DAO database engine object. If you have 
   // called a DAO object in your application prior 
   // to calling the function below, you must call 
   // AfxDaoTerm to destroy the existing database 
   // engine object. Otherwise, the database engine 
   // object already in use will be reused, and setting
   // a system datbase will have no effect.
   //
   // If you have used a DAO object prior to calling 
   // this function it is important that DAO be 
   // terminated with AfxDaoTerm since an MFC
   // module only gets one copy of the database engine 
   // and that engine will be reused if it hasn't been 
   // terminated. In other words, if you do not call 
   // AfxDaoTerm and there is currently a database 
   // initialized, setting the system database will 
   // have no affect.

   SetSystemDB( strSystemDB );

   // User name and password manually added
   // by using Microsoft Access
   CString strUserName = _T( "NewUser" );
   CString strOldPassword = _T( "Password" );
   CString strNewPassword = _T( "NewPassword" );

   // Set default user so that MFC will be able
   // to log in by default using the user name and 
   // password from the system database
   SetDefaultUser( strUserName, strOldPassword );

   // Change the password. You should be able to
   // call this function from anywhere in your 
   // MFC application
   ChangePassword( strUserName, strOldPassword, 
                   strNewPassword );

   .
   .
   .

}

Следующие четыре примеры демонстрируют, как:

Установка системной базы данных

Ниже приведен пример функции для задания системной базы данных, которая будет использоваться в приложении. Эта функция должна вызываться до того, как любой другой DAO звонков.

/ / Набор системной базы данных / / будет использовать компонент database engine DAO

void SetSystemDB (CString amp; strSystemMDB)
{
   COleVariant varSystemDB (strSystemMDB, VT_BSTRT);

/ / Инициализировать DAO MFC
   AfxDaoInit ();
   DAODBEngine * pDBEngine = (AfxDaoGetEngine);

ASSERT (pDBEngine! = NULL);

/ / Вызова метода put_SystemDB для установки / / система база данных для DAO двигателя
   DAO_CHECK (pDBEngine - > put_SystemDB (varSystemDB.bstrVal));
}

Настройка пользователя по умолчанию и пароль

Чтобы задать пользователя по умолчанию и пароль системной базы данных, используйте следующую функцию:

void SetDefaultUser (CString amp; strUserName, CString & strPassword)
{
  COleVariant varUserName (strUserName, VT_BSTRT);
  COleVariant varPassword (strPassword, VT_BSTRT);

DAODBEngine * pDBEngine = (AfxDaoGetEngine);
  ASSERT (pDBEngine! = NULL);

/ / Набор пользователя по умолчанию:
  DAO_CHECK (pDBEngine - > put_DefaultUser (varUserName.bstrVal));

/ / Установить пароль по умолчанию:
  DAO_CHECK (pDBEngine - > put_DefaultPassword (varPassword.bstrVal));
}

Изменение пароля пользователя

Чтобы изменить пароль пользователя, используйте следующую функцию:

void ChangePassword( CString &strUserName, 
                     CString &strOldPassword, 
                     CString &strNewPassword )
{
   // Create (open) a workspace
   CDaoWorkspace wsp;
   CString strWspName = _T( "Temp Workspace" );

   wsp.Create( strWspName, strUserName,
               strOldPassword );
   wsp.Append( );

   // Determine how many objects there are
   // in the Users collection
   short nUserCount;
   short nCurrentUser;
   DAOUser *pUser  = NULL;
   DAOUsers *pUsers = NULL;

   // Side-effect is implicit OLE AddRef( ) 
   // on DAOUser object:
   DAO_CHECK( wsp.m_pDAOWorkspace->get_Users( &pUsers ) );

   // Side-effect is implicit OLE AddRef( ) 
   // on DAOUsers object
    DAO_CHECK( pUsers->get_Count( &nUserCount ) );

   // Traverse through the list of users 
   // and change password for the userid
   // used to create/open the workspace
   for( nCurrentUser = 0; nCurrentUser < nUserCount;
        nCurrentUser++ )
   {
       COleVariant varIndex( nCurrentUser, VT_I2 );
       COleVariant varName;

       // Retrieve information for user nCurrentUser
       DAO_CHECK( pUsers->get_Item( varIndex, &pUser ) );

       // Retrieve name for user nCurrentUser
       DAO_CHECK( pUser->get_Name( &V_BSTR( &varName ) ) );

       CString strTemp = V_BSTRT( &varName );

       // If there is a match, change the password
       if( strTemp == strUserName )
       {
           COleVariant varOldPwd( strOldPassword, 
                                  VT_BSTRT );
           COleVariant varNewPwd( strNewPassword, 
                                  VT_BSTRT );

           DAO_CHECK( pUser->NewPassword( V_BSTR( &varOldPwd ),
                      V_BSTR( &varNewPwd ) ) );

           TRACE( "\t Password is changed\n" );
       }
   }

   // Clean up: decrement the usage count
   // on the OLE objects
   pUser->Release( );
   pUsers->Release( );

   wsp.Close( );
}

Изменение пароля.MDB файла

Чтобы изменить пароль.MDB файл, используйте следующую функцию:

void SetDBPassword (LPCTSTR pDB, LPCTSTR pszOldPassword, LPCTSTR pszNewPassword)
{
 nbsp; CDaoDatabase дБ;
   CString strConnect (_T ("; pwd ="));

/ / база данных должна быть открыт как эксклюзивные
   / / установить пароль
   DB.Открыть (pDB, TRUE, FALSE, strConnect + pszOldPassword);

COleVariant NewPassword (pszNewPassword, VT_BSTRT),
               Параметр OldPassword (pszOldPassword, VT_BSTRT);

DAO_CHECK (db.m_pDAODatabase - > NewPassword (V_BSTR (и параметр OldPassword),
              V_BSTR (и NewPassword)));

DB.Close();
}

Технические примечания по номеру |nbsp; Технические примечания по категориям

Index