MFC DAO 데이터베이스 클래스를 사용 하면 DAO를 직접 사용 하는 데 필요한 경우가 있을 수 있습니다. 일반적으로이 경우, 되지 않을 것입니다 하지만 MFC 직접 DAO 호출 MFC 클래스를 사용 하 여 결합 하는 경우 간단한 만들기 직접 DAO 호출을 용이 하 게 일부 도우미 메커니즘을 제공 하고있다. 직접 DAO를 만들고 관리 하는 MFC DAO 개체의 메서드 호출을 단 몇 줄의 코드 필요 합니다. 만들고 않은 DAO 개체를 사용 하 여 필요 없는 MFC에 의해 관리, 당신은 해야 할 것입니다 조금 더 많은 작업 실제로 개체에 릴리스 를 호출 하 여. 이 기술 노트 DAO를 직접 호출 하려는 때, MFC 헬퍼, 도움이 무엇을 할 수 및 DAO OLE 인터페이스를 사용 하는 방법에 설명 합니다. 이 노트에서는 DAO 보안 기능에 대 한 직접 DAO를 호출 하는 방법을 보여 주는 몇 가지 샘플 함수를 제공 하는 마지막으로,。
MFC에 의해 바뀌지 기능을 구현 하는 경우 또는 직접 DAO 호출을 만들기 위한 가장 일반적인 상황은 컬렉션 새로 고칠 필요가 있을 때 발생 합니다. MFC에 의해 노출 되지 않습니다 가장 중요 한 기능은 보안입니다. 보안 기능을 구현 하려는 경우에 DAO 사용자 및 그룹 개체를 직접 사용 해야 합니다. 보안, 게다가 거기에 몇 가지 다른 DAO 기능 MFC에서 지원 되지 않습니다. 뿐만 아니라 약간 늦게 추가 DAO recordset 복제 및 데이터베이스 복제 기능 포함。
작은 것 들에 대해 걱정할 필요가 없습니다 그래서 많은 세부 사항을 처리 하 여 쉽게 DAO를 사용 하는 DAO 게의 MFC의 배치. 이 OLE, 생성 및 DAO 개체 (특히 컬렉션 개체)의 관리 오류 검사 및 제공 하는 강력한 형식, 간단한 인터페이스 ( VARIANT 또는 BSTR 인수)의 초기화를 포함 합니다. 직접 DAO를 호출 하 고 이러한 기능을 여전히 활용 수 있습니다. 직접 DAO 호출 하 여 만든 모든 개체에 대 한 릴리스 를 호출 하는 코드가 해야 할 모든가 아닌 MFC에서 내부적으로 사용할 수 있는 인터페이스 포인터를 수정 합니다. 예를 들어, 당신은 모든 내부 결과 이해 하지 않는 오픈 CDaoRecordset 개체의 m_pDAORecordset 멤버를 수정 하지 마십시오. 그러나 m_pDAORecordset 인터페이스를 사용 하 여 필드 컬렉션을 직접 DAO를 호출 수 있습니다. 이 경우 m_pDAORecordset 멤버는 수정할 수 없습니다. 개체를 마치면 Fields 컬렉션 개체에 릴리스 를 호출 하기만 하면。
DAO를 쉽게 호출할 수 있도록 제공 하는 헬퍼 MFC DAO 데이터베이스 클래스에서 내부적으로 사용 되는 동일한 헬퍼입니다. 이러한 헬퍼는 로그 디버그 출력 예상된 오류를 검사 하 고 필요한 경우 적절 한 예외를 throw 직접 DAO를 호출 하는 경우에 반환 코드를 확인 하는 데 사용 됩니다. 거기에 두 개의 기본 도우미 함수 및 이러한 두 도우미 중 하나에 매핑되는 4 개의 매크로. 최고의 설명을 간단 하 게 코드를 읽을 것입니다. DAO_CHECK, DAO_CHECK_ERROR, DAO_CHECK_MEM및 AFXDAO에서 DAO_TRACE 를 참조 하십시오.매크로, AfxDaoCheck 및 AfxDaoTrace DAOCORE에서 볼 수 H.CPP。
DAO 개체 계층 구조에 있는 각 개체에 대 한 OLE 인터페이스는 DBDAOINT 헤더 파일에 정의 됩니다.H \Program Files\DevStudio\VC\include 디렉터리에서 발견 된다. 이러한 인터페이스는 전체 DAO 계층 조작할 수 있는 메서드를 제공。
많은 DAO 인터페이스의 메서드를 BSTR 개체 (길이 접두사가 문자열 OLE 자동화에 사용 되는)를 조작 해야 합니다. BSTR 개체는 일반적으로 VARIANT 데이터 형식 내에서 캡슐화 됩니다. MFC 클래스 자체 COleVariant VARIANT 데이터 형식에서 상속 됩니다. 여부 ANSI 또는 유니코드에 대 한 프로젝트를 빌드에 따라 DAO 인터페이스는 ANSI 또는 유니코드 BSTRs를 반환 됩니다. V_BSTR 및 V_BSTRT, 두 매크로 DAO 인터페이스 가져옵니다 예상한 형식의 BSTR 을 보장 하는 데 유용。
V_BSTR COleVariant의 bstrVal 멤버를 추출 합니다. 이 매크로 DAO 인터페이스의 메서드와 COleVariant 내용을 전달 해야 하는 경우에 일반적으로 사용 됩니다. 다음 코드 단편은 보여줍니다 선언 및 V_BSTR 매크로 활용 하는 DAO DAOUser 인터페이스의 두 가지 방법에 대 한 실제 사용:
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; get_Name (V_BSTR (& varOldName)));
DAO_CHECK (pUser-> put_Name (V_BSTR (& varNewName)))
참고 위의 COleVariant 생성자에 지정 된 VT_BSTRT 인수는 거기 보장 하는 응용 프로그램의 유니코드 버전에 대 한 응용 프로그램 및 Uunicode BSTR 의 ANSI 버전을 구축 하는 경우 ANSI BSTR COleVariant 에 있을 것입니다. 이 DAO 무엇을 기대합니다。
다른 매크로, V_BSTRT, 빌드 (ANSI 또는 유니코드)의 종류에 따라 COleVariant 의 ANSI 또는 유니코드 bstrVal 구성원을 추출 합니다. 다음 코드에서는 CString 으로 COleVariant 에서 BSTR 값을 추출 하는 방법을 보여 줍니다.:
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 컬렉션 개체를 새로 고치려면 필요한 경우 발생할 수 있습니다. 일반적으로이 필요는 없습니다, 하지만 필요한 경우 간단한 절차 이다. 때 컬렉션 새로 고쳐야 할 수도 있습니다의 예는 새 tabledefs을 만드는 여러 사용자와 다중 사용자 환경에서 작동 하는 경우입니다. 이 경우에 tabledefs 컬렉션 오래 된 될 수도 있습니다. 컬렉션을 새로 고치, 당신은 단순히 필요가 특정 컬렉션 개체의 Refresh 메서드를 호출 하 고 오류를 확인 하십시오:
DAO_CHECK (pMyDaoDatabase-gt;
?? m_pDAOTableDefs-> 새로 고침 ())
참고 현재 모든 DAO 컬렉션 개체 인터페이스는 MFC 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 );
.
.
.
}
다음 4 개의 예제를 설명 하는 방법:
시스템 데이터베이스 설정
아래 응용 프로그램에서 사용 하는 시스템 데이터베이스를 설정 하는 샘플 함수가입니다. 다른 DAO 호출 하기 전에이 함수를 호출 해야 합니다.
/ / 시스템 데이터베이스 설정 합니다 / / DAO 데이터베이스 엔진을 사용 하는
void SetSystemDB (CString amp; strSystemMDB)
{
? COleVariant varSystemDB (strSystemMDB, VT_BSTRT);
/ / MFC의 DAO 초기화
? 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 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)