テクニカル ノート 54: MFC DAO クラス使用中の DAO の直接呼び出し
[!メモ]
Visual C++ .NET では、Visual C++ 開発環境およびウィザードでは DAO はサポートされなくなりました (DAO クラスは含まれているので、このクラスを使うことはできます)。Microsoft は、新しいプロジェクトに [OLE DB Templates] か ODBC と MFC を使用することをお勧めします。DAO は、既存のアプリケーションを保守するためだけに使用してください。
MFC の DAO データベース クラスを使用すると、DAO を直接使用する必要がある状況がある場合があります。通常、はそうではありませんが、MFC の使用をまとめることが DAO の直接呼び出しに分類する場合は、MFC DAO の直接呼び出しを簡略化しやすくするために、ヘルパー機構を提供します。MFC の DAO マネージ オブジェクトのメソッドに DAO を直接使用することは、以下のコード行のみを要求する必要があります。MFC によって管理されていない DAO のオブジェクトを作成して使用する必要がある場合は、実際はオブジェクトの [リリース] を呼び出すことで、他の作業を少しする必要があります。このテクニカル ノートは、DAO を直接呼び出すする方法を示していますするするために MFC のヘルパーが実行できる操作と DAO の OLE インターフェイスを使用する方法を示します。最後に、このメモは、指定したサンプル関数を DAO のセキュリティ機能の DAO を直接呼び出すことができます。
いつ DAO を直接使用できます。
DAO 直接使用するための共通の状態はコレクションを更新する必要がある場合は、MFC でラップされていない機能を実装している場合に発生します。MFC には公開されない最も重要な機能は、セキュリティです。セキュリティ機能を実装する場合は、DAO のユーザーを使用する必要があり、グループは、直接取得します。セキュリティのほかに、MFC でサポートされていない DAO のそのほかのいくつかの機能だけです。これらは DAO レコードセットのデータベースにレプリケートおよびレプリケーション機能、いくつかの以降の追加があります。
DAO と MFC 実装の概要
MFC DAO ラップすることで、DAO を使用して複数の詳細を処理して簡単になります。つまり、小さい点を考慮する必要はありません。これは、DAO のオブジェクト (特にコレクション オブジェクト)、OLE の作成と管理、エラー チェック、および提供するの初期化を厳密に型指定された、より単純なインターフェイス (BSTR の [VARIANT] または引数なし)。まだ DAO の直接呼び出しを、これらの機能を使用できます。コードはすべて MFC を内部的に依存する場合があります。DAO の直接呼び出しによって作成されたオブジェクトの [リリース] を呼び出して、インターフェイス ポインターのいずれも変更しないようにする必要があります。たとえば、すべての 内部動作を理解していない場合、CDaoRecordset の開いているオブジェクトの m_pDAORecordset のメンバーを変更しないでください。ただし、フィールドのコレクションを取得するには、DAO を直接呼び出すために m_pDAORecordset のインターフェイスを使用できます。この場合 m_pDAORecordset のメンバーは変更されません。オブジェクトを使い終わったら、フィールドのコレクション オブジェクトに [リリース] を単にを呼び出す必要があります。
DAO の呼び出しを容易にするヘルパーの説明
DAO をより簡単呼び出すことができるように用意されているヘルパーは、MFC DAO データベース クラスの内部で使用されているヘルパーです。これらのヘルパーがリターン コードを確認するために使用され、し、予期されるエラーの DAO の直接呼び出し、記録のデバッグ出力を、適切な例外をスローするときは、必要に応じてチェックします。これらの二つのヘルパーの 1 にマップする 4 種類のマクロおよび 2 の基になるヘルパー関数があります。最適な説明はコードを単に読み取ることです。マクロを表示するには AFXDAO.H の DAO_CHECK、DAO_CHECK_ERROR、DAO_CHECK_MEMと DAO_TRACE を表示 DAOCORE.CPP の AfxDaoCheck と AfxDaoTrace を参照してください。
DAO の OLE のインターフェイスを使用する
DAO のオブジェクト階層の各オブジェクトの OLE インターフェイスは\Program の Files\Microsoft Visual Studio .NET 2003\VC7\include のディレクトリにあるヘッダー ファイル DBDAOINT.H に定義されます。これらのインターフェイスは、DAO の階層全体を操作できるようにするメソッドを提供します。
DAO インターフェイスのメソッドの多くには、BSTR のオブジェクト (OLE オートメーションで使用される長さ前に付いた文字列) を処理する必要があります。BSTR のオブジェクトは [VARIANT] のデータ型の中で通常、カプセル化します。MFC クラス COleVariant 自体は [VARIANT] のデータ型から継承します。によって ANSI 形式または Unicode のプロジェクトをビルドするか、DAO のインターフェイスは ANSI 文字または Unicode BSTR、.を返します。2 種類のマクロ、V_BSTR と V_BSTRTは、DAO のインターフェイスが、予期される型の BSTR を取得するようにする場合に便利です。
V_BSTR は COleVariantの bstrVal のメンバーを抽出します。このマクロは、通常は DAO インターフェイス メソッドに COleVariant の内容を渡す必要がある場合に使用されます。次のコードは V_BSTR のマクロを利用する DAO DAOUser のインターフェイスの 2 種類のメソッドの申告実用と要素の両方を示します:
COleVariant varOldName;
COleVariant varNewName( _T("NewUser"), VT_BSTRT );
// Code to assign pUser to a valid value omitted
DAOUser *pUser = NULL;
// These method declarations were taken from DBDAOINT.H
// STDMETHOD(get_Name) (THIS_ BSTR FAR* pbstr) PURE;
// STDMETHOD(put_Name) (THIS_ BSTR bstr) PURE;
DAO_CHECK( pUser->get_Name( &V_BSTR ( &varOldName ) ));
DAO_CHECK( pUser->put_Name( V_BSTR ( &varNewName ) ));
アプリケーションの Unicode バージョンのアプリケーションの ANSI バージョンと Unicode BSTR をビルド COleVariant に ANSI BSTR があることを COleVariant 上のコンストラクターで指定された VT_BSTRT の引数を使用することに注意してください。これは、DAO が動作です。
他のマクロ、V_BSTRTは、ビルドの種類によって、COleVariant の ANSI 文字または Unicode の bstrVal のメンバーを抽出 (ANSI 文字または Unicode)。次のコードは CStringに COleVariant から BSTR の値を抽出する方法を示しています:
COleVariant varName( _T( "MyName" ), VT_BSTRT );
CString str = V_BSTRT( &varName );
COleVariantに格納されている他の型を DAOVIEW の例で開くそのほかの手法とともに V_BSTRT のマクロは、です。具体的には、この変換は CCrack::strVARIANT のメソッドで実行されます。このメソッドは CStringのインスタンスに、できる限り COleVariant の値をに変換します。
DAO への直接呼び出しの例
状態は、基になる DAO のコレクション オブジェクトを更新する必要がある場合に発生することがあります。通常、これは必須ではありませんが、必要に応じてここでは、簡単な手順です。コレクションを更新する必要がある場合に、この例では、の新しい tabledefs を作成する複数のユーザーを持つマルチユーザー環境で動作する場合です。この場合は、tabledefs のコレクションは古くなっている可能性があります。コレクションを更新するには、特定のコレクション オブジェクトに [最新の情報に更新] のメソッドを呼び出し、エラーを確認するだけです:
DAO_CHECK( pMyDaoDatabase->
m_pDAOTableDefs->Refresh( ) );
現在のコレクションのすべての 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 データベース (.MDW ファイル) を設定します。
既定のユーザーとパスワードを設定します。
ユーザーのパスワードを変更します。
.MDB ファイルのパスワードを変更します。
システム データ ファイル ベースの配置
アプリケーションで使用されるシステム データのベースを設定したサンプル関数は次のとおりです。この関数は、DAO の他の呼び出しが行われる前に呼び出す必要があります。
// Set the system database that the
// DAO database engine will use
void SetSystemDB( CString & strSystemMDB )
{
COleVariant varSystemDB( strSystemMDB, VT_BSTRT );
// Initialize DAO for MFC
AfxDaoInit( );
DAODBEngine* pDBEngine = AfxDaoGetEngine( );
ASSERT( pDBEngine != NULL );
// Call put_SystemDB method to set the
// system database for DAO engine
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 );
// Set default user:
DAO_CHECK( pDBEngine->put_DefaultUser( varUserName.bstrVal ) );
// Set default password:
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=" ) );
// the database must be opened as exclusive
// to set a password
db.Open( 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();
}