TN054: Wywoływanie DAO bezpośrednio podczas korzystania z klas MFC DAO
[!UWAGA]
Począwszy od programu Visual C++ .NET środowiska Visual C++ i kreatorzy już obsługiwać DAO (choć klasy DAO są uwzględniane i nadal można je).Firma Microsoft zaleca użycie Szablonów OLE DB lub ODBC i MFC dla nowych projektów.W utrzymaniu istniejących aplikacji, należy używać tylko obiektów DAO.
Podczas korzystania z klasami baz danych MFC DAO, może być sytuacji, gdy jest niezbędne do bezpośrednio używać obiektów DAO.Zwykle nie będzie to w przypadku, ale MFC dostarczyła niektóre mechanizmy pomocnika w celu ułatwienia podejmowania bezpośrednich połączeń DAO proste, gdy połączenie klas MFC z bezpośrednich połączeń DAO.Dokonywanie DAO bezpośrednie wywołania metod obiektu DAO zarządzane MFC powinny wymagać tylko kilka wierszy kodu.Jeśli trzeba utworzyć i używać obiektów DAO, które są nie zarządza MFC, trzeba będzie zrobić nieco więcej pracy faktycznie wywołując wersji na obiekcie.Ta Uwaga techniczna wyjaśnia, kiedy należy bezpośrednio wywoływać DAO, co pomocników MFC zrobić, aby pomóc i jak używać interfejsów DAO OLE.W końcu ta notatka zawiera niektóre funkcje próbki prezentujący wzywają DAO bezpośrednio do funkcji zabezpieczeń obiektów DAO.
Kiedy należy wykonywać połączenia bezpośrednie DAO
Najczęściej występujące sytuacje dokonywania kierowania wywołań obiektów DAO występuje podczas zbiorów wymagają odświeżenia lub kiedy realizują funkcje nie zawijać za MFC.Najbardziej znaczący funkcji, które nie są udostępniane przez MFC jest bezpieczeństwo.Jeśli użytkownik chce zaimplementować zabezpieczenia, musisz bezpośrednio używać obiektów DAO użytkowników i grup (y).Oprócz zabezpieczeń są tylko kilka innych obiektów DAO funkcji nieobsługiwanych przez MFC.Należą do nich funkcje replikacji rekordów klonowanie i bazy danych, a także kilka dodatków opóźnione do obiektów DAO.
Krótki przegląd obiektów DAO i wprowadzania w życie MFC
Sprawia, że DAO przy użyciu obiektów DAO łatwiejsze poprzez obsługę wiele informacji, więc nie trzeba martwić się o małe rzeczy w pakowania na MFC.Obejmuje to inicjowania OLE, tworzenie i zarządzanie obiektów DAO (zwłaszcza kolekcja obiektów), błąd, sprawdzania i zapewnienie jednoznacznie, prostszy interfejs (nie WARIANTU lub BSTR argumenty).Można nawiązywać bezpośrednich połączeń telefonicznych DAO i nadal korzystać z tych funkcji.Wszystko, co musisz zrobić kodu jest wywołanie wersji dla obiektów utworzonych przez bezpośrednie DAO wywołuje i nie modyfikowania wskaźników interfejsów, które MFC może opierać się na wewnętrznie.Na przykład, nie należy modyfikować m_pDAORecordset Członkowskich otwartej CDaoRecordset obiekt bez zrozumienia Wszystkie konsekwencje wewnętrznego.Można jednak użyć m_pDAORecordset interfejsu, aby wywołać DAO bezpośrednio, aby uzyskać kolekcji Fields.W tym przypadku m_pDAORecordset Członkowskich nie będzie zmodyfikowany.Po prostu trzeba wywoływać wersji do obiektu kolekcji pól po zakończeniu pracy z obiektem.
Opis pomocników aby DAO wywołuje łatwiejsze
Pomocników, pod warunkiem, aby wywołanie DAO łatwiejsze są tym samym pomocników, które są używane wewnętrznie do klas MFC DAO w bazie danych.Te są używane do sprawdzania kody powrotne, przy podejmowaniu bezpośrednie wywołanie DAO, rejestrowanie wyjścia debugowania sprawdzanie oczekiwane błędy i generowania wyjątków odpowiednie, jeśli to konieczne.Istnieją dwie podstawowe funkcje pomocnika i cztery makr, które są mapowane do jednego z tych dwóch pomocników.Najlepsze wyjaśnienie byłoby po prostu odczytać ten kod.Zobacz DAO_CHECK, DAO_CHECK_ERROR, DAO_CHECK_MEM, i DAO_TRACE w AFXDAO.H-Zobacz makra oraz AfxDaoCheck i AfxDaoTrace w DAOCORE.CPP.
Za pomocą interfejsów DAO OLE
Interfejsy OLE dla każdego obiektu w hierarchii obiektów DAO są zdefiniowane w pliku nagłówkowym DBDAOINT.Godz., który znajduje się w katalogu \Program Files\Microsoft 2003\VC7\include programu Visual Studio .NET.Te interfejsy omówiono metody umożliwia manipulowanie całej hierarchii DAO.
Dla wielu metod w interfejsach DAO, trzeba będzie manipulować BSTR obiektu (poprzedzona długość ciąg używany w automatyzacji OLE).BSTR Obiektu zazwyczaj hermetyzowane w WARIANTU typu danych.Klasy MFC COleVariant się dziedziczy z WARIANTU typu danych.W zależności od tego, czy tworzyć projekty dla ANSI lub Unicode, interfejsy DAO zwróci ANSI lub Unicode BSTRs.Dwóch makr, V_BSTR i V_BSTRT, są używane do zapewnienia, że interfejsu DAO pobiera BSTR oczekiwanego typu.
V_BSTR wydobędzie bstrVal członkiem COleVariant.To makro jest zwykle używany podczas należy przekazywać zawartość COleVariant do metody interfejsu DAO.Poniższy fragment kodu zawiera deklaracje i rzeczywistego wykorzystania dla dwóch metod interfejsu DAO DAOUser, który skorzystać z V_BSTR makro:
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 ) ));
Należy zauważyć, że VT_BSTRT argument określony w COleVariant Konstruktor powyżej daje pewność, że będzie ANSI BSTR w COleVariant Jeśli budować wersja ANSI i Unicode aplikacji BSTR dla wersji Unicode aplikacji.Jest to, czego oczekuje DAO.
Inne makro, V_BSTRT, rozpakuje ANSI lub Unicode bstrVal członkiem COleVariant w zależności od typu budowy (ANSI lub Unicode).Poniższy kod ilustruje sposób wyodrębnić BSTR wartość z COleVariant do CString:
COleVariant varName( _T( "MyName" ), VT_BSTRT );
CString str = V_BSTRT( &varName );
V_BSTRT makro, wraz z innymi technikami, aby otworzyć inne typy, które są przechowywane w COleVariant, to pokazano w przykładowej DAOVIEW.W szczególności tłumaczenie adresów jest wykonywane w CCrack::strVARIANT metoda.Tej metody, jeśli to możliwe, dokonuje translacji wartość COleVariant do instancji CString.
Prosty przykład bezpośrednie wywołanie DAO
Sytuacji może powstać, gdy jest to konieczne odświeżyć pod spodem obiekty kolekcji obiektów DAO.Normalnie to nie jest konieczne, ale jest to prosty sposób, w razie potrzeby.Przykładem kiedy kolekcja może być konieczne jest odświeżenie jest podczas pracy w orodowisku wielu użytkownikom tworzenie nowych tabledefs.W tym przypadku kolekcji tabledefs może stać się nieaktualne.Aby odświeżyć kolekcji, po prostu trzeba wywołać Odśwież metody obiektu kolekcji szczególne i wyboru dla błędów:
DAO_CHECK( pMyDaoDatabase->
m_pDAOTableDefs->Refresh( ) );
Należy zauważyć, że obecnie wszystkie interfejsy obiektu kolekcji obiektów DAO szczegóły implementacji nieudokumentowane klas MFC DAO bazy danych.
Bezpośrednio do funkcji zabezpieczeń obiektów DAO przy użyciu obiektów DAO
Klas MFC DAO bazy danych nie jest zawijany funkcje zabezpieczeń obiektów DAO.Należy wywołać metody DAO interfejsów do użycia niektórych funkcji zabezpieczeń obiektów DAO.Poniższa funkcja ustawia systemowej bazy danych, a następnie zmienia hasło użytkownika.Ta funkcja wymaga trzech innych funkcji, które następnie są zdefiniowane.
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 );
.
.
.
}
Poniższe cztery przykłady przedstawiają sposób:
Ustaw systemowej bazy danych DAO (.Plik MDW).
Ustawianie domyślnego użytkownika i hasło.
Zmienić hasło użytkownika.
Zmień hasło.Plik MDB.
Ustawienie systemowej bazy danych
Poniżej jest funkcją próbki, aby ustawić systemowej bazy danych, który będzie używany przez aplikację.Ta funkcja musi być wywołana przed wykonaniem jakichkolwiek innych połączeń 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 ) );
}
Ustawianie domyślnego użytkownika i hasło
Aby ustawić domyślnego użytkownika i hasło dla systemowej bazy danych, należy użyć następującej funkcji:
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 ) );
}
Zmiana hasła użytkownika
Aby zmienić hasło użytkownika, należy użyć następujących funkcji:
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( );
}
Zmiany hasła.Plik MDB
Aby zmienić hasło.MDB plik, należy użyć następujących funkcji:
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();
}