다음을 통해 공유


TN054: MFC DAO 클래스를 사용 하는 동안 직접 DAO를 호출

[!참고]

Visual C++ .NET에서는 포함된 DAO 클래스를 아직 사용할 수 있지만 Visual C++ 환경 및 마법사가 더 이상 DAO를 지원하지 않습니다.사용 하는 것이 좋습니다 OLE DB 템플릿 또는 ODBC와 MFC 새 프로젝트.DAO는 기존 응용 프로그램을 유지 관리하는 데만 사용할 수 있습니다.

MFC DAO 데이터베이스 클래스를 사용 하면 DAO를 직접 사용 하는 데 필요한 경우도 있을 수 있습니다.일반적으로이 경우는 되지 않지만 MFC DAO를 직접 호출을 결합 하는 MFC 클래스를 사용 하면 직접 DAO 호출 간단한를 돕기 위해 일부 도우미 메커니즘을 제공 합니다.DAO를 직접 만드는 DAO MFC 관리 되는 개체의 메서드를 호출 하는 코드를 몇 줄만 필요 합니다.DAO 개체를 만들고 필요한 경우 하지 MFC에서 관리 하 고, 실제로 호출 하 여 좀 더 많은 작업을 수행 하면 됩니다 릴리스 개체입니다.이 기술 노트에서는 DAO를 직접 호출 할 수 있습니다, MFC 도우미를 하는 데 수행할 수 있는 및 DAO OLE 인터페이스를 사용 하는 방법을 설명 합니다.마지막으로,이 노트 DAO 보안 기능에 대 한 직접 DAO를 호출 하는 방법을 보여 주는 몇 가지 샘플 함수를 제공 합니다.

직접 DAO를 호출 하는 경우

때 MFC에서 래핑되지 않은 기능을 구현 하는 또는 컬렉션이 새로 고쳐야 할 때 직접 DAO를 호출 하는 가장 일반적인 상황을 발생 합니다.MFC에서 노출 되지 않는 가장 중요 한 기능은 보안 있습니다.보안 기능을 구현 하려면 DAO 사용자 및 그룹 개체를 직접 사용 해야 합니다.보안 외에도 가지 MFC에서 지원 되지 않는 몇 가지 다른 DAO 기능만 있습니다.여기에 몇 가지 추가 dao 뿐만 아니라 recordset 데이터베이스 복제 및 복제 기능 포함 됩니다.

DAO와 MFC의 구현에 대해 간략하게

MFC의 래핑의 많은 세부 정보에 대 한 사소한 부분까지 신경을 쓸 필요가 없도록를 처리 하 여 DAO를 쉽게 사용 하는 DAO 게.여기에 OLE, 작성 및 관리의 오류를 검사 하 고 강력한, 간단한 인터페이스를 제공 하는 DAO 개체 (특히 컬렉션 개체)를 초기화 (없음 변형 또는 BSTR 인수).DAO를 직접 호출 하 고 이러한 기능을 계속 이용할 수 있습니다.코드가 수행 하는 호출 릴리스 직접 DAO에서 만든 모든 개체에 대해 호출 및 하지 MFC를 내부적으로 사용할 수 있는 인터페이스 포인터를 수정 합니다.예를 들어 수정 하지는 m_pDAORecordset 열린 소속 CDaoRecordset 개체를 이해 하지 못하면 모든 내부 효과.그러나 사용할 수 있는 m_pDAORecordset Fields 컬렉션을 가져오려면 직접 DAO를 호출 하는 인터페이스.이 경우는 m_pDAORecordset 멤버를 수정할 수 없습니다.호출 하기만 하면 릴리스 개체를 마친 Fields 컬렉션 개체의.

DAO를 만들려면 도우미의 설명을 쉽게 호출

DAO를 쉽게 호출할 수 있도록 제공 되는 도우미의 MFC DAO 데이터베이스 클래스에서 내부적으로 사용 되는 동일한 도우미입니다.이러한 도우미 클래스를 디버그 출력 예상 되는 오류를 검사 하 고 필요한 경우 적절 한 예외를 throw 하는 로깅 직접 DAO를 호출 하면 반환 코드를 확인 하는 데 사용 됩니다.기본 도우미 함수 두 개와 이러한 두 도우미 중 하나에 매핑되는 네 매크로입니다.가장 간단 하 게 코드를 읽을 수 있어야 합니다.볼 DAO_CHECK, DAO_CHECK_ERROR, DAO_CHECK_MEM, 및 DAO_TRACE AFXDAO에 있습니다.H와 매크로 볼 수 AfxDaoCheckAfxDaoTrace DAOCORE에 있습니다.CPP입니다.

DAO OLE 인터페이스를 사용 하 여

DAO 개체 계층 구조의 각 개체에 대해 OLE 인터페이스는 DBDAOINT 헤더 파일에 정의 됩니다.H에서 Visual Studio.NET 2003\VC7\include \Program Files\Microsoft 디렉터리를 찾을 수 있습니다.이러한 인터페이스는 전체 DAO 계층 조작할 수 있도록 하는 메서드를 제공 합니다.

많은 DAO 인터페이스 메서드를 조작할 필요가 있는 BSTR 개체 (OLE 자동화에 사용 되는 길이 접두사가 문자열).BSTR 캡슐화 개체 일반적으로 되 내는 변형 데이터 형식입니다.MFC 클래스 COleVariant 자체에서 상속 되는 변형 데이터 형식입니다.여부를 프로젝트 ANSI 또는 유니코드 빌드에 따라 ANSI 나 유니코드 DAO 인터페이스 반환 합니다 BSTRs.두 매크로 V_BSTRV_BSTRT, DAO 인터페이스 확인 하기를 가져옵니다에 대해 유용의 BSTR 예상 되는 형식의.

V_BSTR 추출 됩니다을 bstrVal 의 멤버는 COleVariant.내용을 전달 하는 경우이 매크로 일반적으로 사용 되는 COleVariant DAO 인터페이스의 메서드를.다음 코드 단편은 선언과 활용 DAOUser DAO 인터페이스의 두 가지 방법에 대 한 실제 사용을 보여 줍니다.를 V_BSTR 매크로:

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

이때의 VT_BSTRT 인수에 지정 된는 COleVariant 위의 생성자 수 있을 ANSI BSTRCOleVariant 응용 프로그램 및 유니코드는 ANSI 버전을 빌드할 경우 BSTR 유니코드 버전의 응용 프로그램.이 DAO 무엇을 기대 됩니다.

다른 매크로 V_BSTRT, ANSI 또는 유니코드를 추출 합니다 bstrVal 소속 COleVariant 형식 빌드 (ANSI 또는 유니코드)에 따라.다음 코드를 추출 하는 방법을 보여 줍니다.를 BSTR 값은 COleVariantCString:

COleVariant varName( _T( "MyName" ), VT_BSTRT );
CString str = V_BSTRT( &varName );

V_BSTRT 기타 기술에 저장 된 다른 형식의 열 함께 매크로 COleVariant, DAOVIEW 샘플에 나와 있습니다.이 변환이 수행 됩니다 특히의 CCrack::strVARIANT 메서드.이 메서드 가능한 경우 값을 변환 하는 COleVariant 의 인스턴스로 CString.

Dao를 직접 호출의 간단한 예

내부 DAO 컬렉션 개체를 새로 고칠 필요가 있을 때 경우 발생할 수 있습니다.일반적으로이 필요 해서는 안 되지만 필요한 경우 간단한 절차를입니다.때 컬렉션을 새로 고쳐야 할의 예를 들어 새 테이블 정의 생성 하는 여러 사용자와 다중 사용자 환경에서 작동할 때입니다.이 경우 tabledefs 컬렉션 부실 해질 수 있습니다.컬렉션을 새로 고치려면 호출 하기만 새로 고침 오류에 대 한 특정 컬렉션 개체 및 검사 방법:

DAO_CHECK( pMyDaoDatabase->
    m_pDAOTableDefs->Refresh( ) );

현재 모든 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 데이터베이스 (.MDW 파일)입니다.

  • 기본 사용자 및 암호를 설정 합니다.

  • 사용자의 암호를 변경 합니다.

  • 암호 변경에.MDB 파일입니다.

1s0dx3s7.collapse_all(ko-kr,VS.110).gif시스템 데이터베이스를 설정합니다.

다음 응용 프로그램에서 사용할 시스템 데이터베이스를 설정 하는 샘플 함수가입니다.이 함수는 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 ) );
}

1s0dx3s7.collapse_all(ko-kr,VS.110).gif기본 사용자 및 암호 설정

기본 사용자 및 시스템 데이터베이스에 대 한 암호를 설정 하려면 다음 함수를 사용 합니다.

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

1s0dx3s7.collapse_all(ko-kr,VS.110).gif사용자의 암호를 변경합니다.

사용자의 암호를 변경 하려면 다음 함수를 사용 합니다.

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

1s0dx3s7.collapse_all(ko-kr,VS.110).gif암호를 변경 하는.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();
}

참고 항목

기타 리소스

번호 기술 정보

범주별 기술 노트