MFC DAO クラスを直接使用中 TN054: DAO を呼び出し

MFC DAO データベース クラスを使用する場合、DAO を直接使用する必要がある場合があります。通常これは、されませんが、MFC は、MFC クラスを使用して DAO の直接呼び出しを結合する場合を直接 DAO 呼び出し、シンプルを容易にするいくつかのヘルパーのメカニズムを提供しています。DAO を直接 MFC が管理する DAO オブジェクトのメソッド呼び出しの数行のコードのみ必要があります。作成している DAO オブジェクトを使用する必要があるかどうかいないMFC での管理、あなたは、実際にオブジェクトをリリースを呼び出すことによってより多くの仕事を少し行うしなければなりません。このテクニカル ノートでは、DAO を直接呼び出す場合可能性があります、MFC ヘルパー支援する何ができる DAO OLE インターフェイスを使用する方法について説明します。最後に、このメモは、DAO のセキュリティ機能の直接 DAO を呼び出す方法を示すいくつかのサンプル関数を提供します。

DAO の直接呼び出しを行う場合

コレクションを更新する必要がある場合の DAO 呼び出しを直接、最も一般的な状況が発生するまたはが MFC でラップされない機能を実装しています。MFC で公開されていない最も重要な機能は、セキュリティです。セキュリティ機能を実装する場合は、DAO のユーザーとグループのオブジェクトを直接使用する必要があります。セキュリティのほかに、MFC でサポートされないいくつかその他 DAO 機能のみです。これらのレコード セットのクローン作成とデータベースのレプリケーションの機能だけでなく、DAO に、いくつかの後半の追加が含まれます。

DAO と MFC の実装の概要

DAO は、ささいなことについて心配する必要はありませんので、詳細の多くを処理で DAO を簡単に使用の MFC の折り返し。これには、OLE、作成、管理エラー チェックや、厳密に型指定された単純なインターフェイス (バリアントまたはBSTR引数なし) を提供する DAO オブジェクト (特に、コレクション オブジェクト) の初期化が含まれます。DAO の直接呼び出しを行う、まだこれらの機能を利用することができます。すべてのあなたのコードを行う必要があります呼び出しリリースの DAO の直接呼び出しによって作成されたオブジェクトではなくMFC を内部的に頼ることがあります、インターフェイス ポインターの変更します。たとえば、内部の影響すべて理解していない限りオープンCDaoRecordsetオブジェクトのm_pDAORecordsetメンバーは変更しないでください。ただし、直接フィールドのコレクションを取得するには DAO を呼び出して、 m_pDAORecordsetインターフェイスを使用できます。この場合m_pDAORecordsetメンバーを変更することはできません。単にオブジェクトを終了すると、Fields コレクション オブジェクトをリリースを呼び出す必要があります。

Dao をヘルパーの説明を簡単に呼び出す

DAO を簡単に呼び出せるように提供はヘルパーは、MFC DAO データベース クラスで内部的に使用されるヘルパーと同じものです。これらのヘルパーは、DAO を直接呼び出す際のリターン コードをチェックするデバッグ出力、予想されるエラーのチェックし、必要に応じて適切な例外をスロー ログ使用されます。2 つの基になるヘルパー関数およびこれら 2 つのヘルパーの 1 つにマップする 4 つのマクロがあります。最良の説明は、単に、コードを読むことです。DAO_CHECKDAO_CHECK_ERRORDAO_CHECK_MEM、およびDAO_TRACE AFXDAO を参照してください。H AfxDaoCheckAfxDaoTraceの DAOCORE を参照してください、マクロを参照してください。CPP。

DAO OLE インターフェイスを使用してください。

DAO オブジェクトの階層内の各オブジェクトの OLE インターフェイスは、DBDAOINT のヘッダー ファイルで定義されます。H は、\Program Files\DevStudio\VC\include ディレクトリにあります。DAO 階層の全体を操作する方法これらのインタ フェースを提供します。

DAO インターフェイスのメソッドの多くは、 BSTRオブジェクト (OLE オートメーションで使用する長さのプレフィクスの付いた文字列) を操作する必要があります。BSTRオブジェクトは、通常、バリアントデータ型内でカプセル化されます。MFC クラスを持つ COleVariant自体、バリアントデータ型から継承します。かどうかプロジェクトを ANSI または Unicode のビルドによって、ANSI または Unicode のBSTRs DAO インターフェイスを返します。2 つのマクロは、 V_BSTRV_BSTRT、DAO インターフェイス型のBSTRを取得ことを保証するのに役立ちます。

V_BSTR COleVariantbstrValメンバーを抽出します。このマクロは、 COleVariantの内容は、DAO インターフェイスのメソッドに渡す必要がある場合に通常使用されます。次のコードは、宣言とV_BSTRマクロを利用 DAO DAOUser インターフェイスの 2 つのメソッドの実際の使用の両方を示しています:

COleVariant varOldName;COleVariant varNewName (_T("NewUser")、VT_BSTRT);//PUser を省略する有効な値を割り当てるためのコードDAOUser ※ pUser = NULL;//DBDAOINT からこれらのメソッドの宣言を行った。H//STDMETHOD(get_Name) (THIS_ BSTR まで ※ pbstr) 純粋な;//STDMETHOD(put_Name) (THIS_ BSTR bstr) 純粋な;DAO_CHECK (pUser gt; まで (V_BSTR (& varOldName)));DAO_CHECK (pUser - > put_Name (V_BSTR (varNewName)))

あなたのアプリケーションと Uunicode BSTRの ANSI バージョンの Unicode バージョンのアプリケーションを構築する場合上記のCOleVariantコンス トラクターで指定されたVT_BSTRT引数が保証に注意してください、ANSI BSTR COleVariantになります。これは、何 DAO を期待しています。

他のマクロ、 V_BSTRTCOleVariantビルド (ANSI または Unicode) の種類に応じての ANSI または Unicode のいずれかのbstrValメンバーを抽出します。BSTR値をCOleVariantからCStringに抽出する方法を次に示します:

COleVariant varName (_T (「MyName」)、VT_BSTRT);CString str = V_BSTRT (amp; varName)(&A)

V_BSTRTマクロは、他のオープンをクラックするその他のトリックと一緒にCOleVariant内、保存の種類を示した DAOVIEW サンプルで Visual の C++ の CD に含まれています。具体的には、この翻訳は、 CCrack::strVARIANTメソッドで実行されます。このメソッドは、可能な限り、 COleVariantの値にCStringのインスタンスに変換されます。

DAO の直接呼び出しの例

場合は、基になる DAO コレクション オブジェクトを更新する必要がある場合に発生します。通常これは、必要する必要がありますいないが必要な場合、手順は簡単です。コレクションが更新する必要があります可能性がありますの例は、新しいテーブルを作成する複数のユーザーが、マルチ ユーザー環境での動作時です。この場合、tabledefs コレクションが古くなる可能性があります。コレクションを更新するには、単に特定のコレクションのオブジェクトの更新メソッドを呼び出すし、エラーをチェックする必要があります。:

DAO_CHECK (pMyDaoDatabase gt;m_pDAOTableDefs - > 更新 ())

現在 DAO コレクション オブジェクトのすべてのインターフェイスが、MFC DAO データベース クラスの非公開の実装の詳細があることに注意してください。

DAO 直接 DAO セキュリティ機能を使用します。

MFC DAO データベース クラスは、DAO セキュリティ機能をラップしないでください。いくつか DAO セキュリティ機能を使用するには、DAO インターフェイスのメソッドを呼び出す必要があります。次の関数はシステム データベースを設定し、ユーザーのパスワードを変更します。その後に定義されている 3 つ他の関数のこの関数を呼び出し。

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 );

   .
   .
   .

}

次の 4 つの例を示す方法:

システム データベースの設定

以下は、アプリケーションが使用するシステム データベースを設定する関数のサンプルです。他の DAO 呼び出しが行われる前にこの関数を呼び出す必要があります。

・ システム データベースを設定、/は、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 アンプ、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){特価;CDaoDatabase db;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;カテゴリ別テクニカル ノート(&N)

Index