Korzystając z klasy bazy danych MFC DAO, mogą wystąpić sytuacje, gdzie konieczne jest bezpośrednio należy używać obiektów DAO. Zwykle nie będzie sprawy, ale MFC dostarczyła niektóre mechanizmy pomocnicze do ułatwienia dokonania bezpośredniego DAO wywołania proste, gdy połączenie użycia klas MFC z bezpośrednich połączeń DAO. Tworzenie bezpośredniego DAO wywołania metody 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, będzie masz do tego trochę więcej pracy przez faktycznie wywołaniem wersji obiektu. Ta Uwaga techniczna wyjaśnia, kiedy może chcesz zadzwonić DAO bezpośrednio, co pomocników MFC można zrobić, aby pomóc i sposób użycia interfejsów DAO OLE. Wreszcie Uwaga ta przewiduje niektóre funkcje próbki prezentujący wymagają DAO bezpośrednio funkcje zabezpieczeń DAO.
Najpowszechniejsze sytuacje dokonywania kierowania wywołań obiektów DAO wystąpić podczas zbiorów wymagają odświeżenia lub gdy są implementowania funkcji nie zawijać za pomocą MFC. Najbardziej znaczący funkcja nie zasłonięte MFC jest zabezpieczeń. Jeśli chcesz wdrożyć funkcje zabezpieczeń, trzeba będzie użyć bezpośrednio do obiektów DAO użytkowników i grup. Oprócz zabezpieczeń są tylko kilka innych obiektów DAO funkcje nie obsługiwane przez MFC. Należą do nich funkcji replikacji rekordów klonowanie i bazy danych, a także kilka koniec uzupełnienia DAO.
MFC firmy zawijania DAO ułatwia używanie obiektów DAO łatwiejsze przez obsługę wielu szczegółów, dzięki czemu nie trzeba martwić się o little things. Obejmuje to Inicjowanie OLE, na tworzenie i zarządzanie obiektów DAO (szczególnie obiektów kolekcji), błąd sprawdzania i dostarczanie wymagająca, prostszy interfejs (nie wariant lub BSTR argumentów). Można bezpośrednio wywołań obiektów DAO i nadal korzystać z tych funkcji. Wszystkie wykonać kod jest wymagają wydania obiekty utworzone przez bezpośrednie wywołań obiektów DAO i nie zmieniać wszystkie wskaźniki interfejsu, które MFC może polegać na wewnętrznie. Na przykład nie należy modyfikować członek m_pDAORecordset Otwórz obiekt CDaoRecordset bez znajomości wszystkich wewnętrznych konsekwencje. Za pomocą interfejsu m_pDAORecordset mogłyby jednak wywoływać DAO bezpośrednio po to, aby uzyskać kolekcji pola. W takim przypadku Państwa m_pDAORecordset nie będzie modyfikowany. Po prostu trzeba wywołać wersji obiektu kolekcji pola po zakończeniu z obiektem.
Pomocników, pod warunkiem dokonania wywoływania obiektów DAO łatwiejsze są tym samym pomocników, używane wewnętrznie do klas MFC DAO bazy danych. Te pomocników są używane do Sprawdzanie zwracanych kodów, dokonując bezpośrednie wywołanie DAO, rejestrowanie wyjścia debugowania, sprawdzanie oczekiwane błędy i rzuca właściwe wyjątki, jeśli jest to konieczne. Istnieją dwie podstawowe funkcje pomocnika oraz cztery makra, które mapują do jednego z tych dwóch pomocników. Najlepsze wyjaśnienie jest po prostu odczytać kodu. Zobacz DAO_CHECK, DAO_CHECK_ERROR, DAO_CHECK_MEMi DAO_TRACE w AFXDAO.H makra, i zobacz AfxDaoCheck i AfxDaoTrace w DAOCORE.CPP.
Interfejsy OLE dla każdego obiektu w hierarchii obiektów DAO są zdefiniowane w pliku nagłówka DBDAOINT.H, który znajduje się w katalogu \Program Files\DevStudio\VC\include. Te interfejsy zapewnia metody, które umożliwiają manipulowanie całej hierarchii DAO.
Dla wielu metod w interfejsach DAO będzie trzeba manipuluje obiektem BSTR (ustaloną długość ciągu używany w automatyzacji OLE). Obiekt BSTR zazwyczaj jest zhermetyzowana wewnątrz wariant typ danych. Klasy MFC COleVariant sobie dziedziczy typ danych VARIANT . W zależności od tego, czy tworzenia projektu ANSI lub Unicode interfejsy DAO zwróci s BSTRANSI lub Unicode. Dwa makra, V_BSTR i V_BSTRT, są użyteczne przy zapewnieniu, że interfejsu DAO pobiera BSTR typu oczekiwanego.
V_BSTR zostaną wyodrębnione przez członka bstrVal COleVariant. To makro jest zazwyczaj używany, gdy trzeba przekazać treść COleVariant do metody interfejsu DAO. Poniższy fragment kodu pokazuje, zgłoszenia i rzeczywistego użycia dwóch metod interfejsu DAO DAOUser, czerpiących korzyści z makra V_BSTR:
COleVariant varOldName;
COleVariant varNewName (_T("NewUser"), VT_BSTRT);
/ / Kod przypisać pUser prawidłową wartość pominięta
DAOUser * pUser = NULL;
/ / Deklaracje te metody zostały wzięte z DBDAOINT.H
/ / STDMETHOD(get_Name) (THIS_ BSTR FAR * pbstr) PURE;
/ / STDMETHOD(put_Name) (THIS_ BSTR bstr) PURE;
DAO_CHECK (pUser-gt; get_Name (V_BSTR (& varOldName)));
DAO_CHECK (pUser - > put_Name (V_BSTR (& varNewName)))
Należy zauważyć, że argument VT_BSTRT , określonych w powyższych konstruktora COleVariant zapewnia, że będzie ANSI BSTR w COleVariant , w przypadku tworzenia aplikacji i Uunicode BSTR wersja ANSI dla wersji Unicode aplikacji. Jest to, czego oczekuje DAO.
Inne makro, V_BSTRT, rozpakuje ANSI lub Unicode członka bstrVal COleVariant w zależności od typu kompilacji (ANSI lub Unicode). Poniższy kod ilustruje sposób wyodrębniania wartości BSTR od COleVariant do CString:
COleV&ariant varName (_T ("MojaNazwa"), VT_BSTRT);
CString str = V_BSTRT (amp; argument Nazwa_zmiennej)
Makra V_BSTRT , wraz z innymi wskazówki do złamania otwieranie innych typów przechowywany wewnątrz COleVariant, zostanie wykazane w próbce DAOVIEW, zawarte na dysku CD z Visual C++. W szczególności tłumaczenie adresów jest wykonywane w metodzie CCrack::strVARIANT . Ta metoda, w przypadku gdy jest to możliwe, tłumaczy wartość COleVariant na wystąpienie CString.
Sytuacje mogą wyniknąć, kiedy konieczne jest odświeżenie obiektów kolekcji obiektów DAO. Zwykle nie dokonać niezbędnych, ale jest prostą procedurę, gdy jest to konieczne. Na przykład gdy kolekcja trzeba być odświeżane jest podczas pracy w środowisku wielu użytkowników z wielu użytkownikom tworzenie nowych tabledefs. W tym przypadku kolekcji tabledefs mogą stać się przestarzałe. Aby odświeżyć zbierania, po prostu należy wywołać metodę odświeżania obiektu określonej kolekcji i sprawdź, czy błędy:
DAO_CHECK (pMyDaoDatabase BT;
m_pDAOTableDefs - > odświeżania ())
Należy zwrócić uwagę, że obecnie wszystkich obiektów DAO kolekcji obiektu interfejsy są szczegóły implementacyjne nieudokumentowane klas bazy danych MFC DAO.
Klasy bazy danych MFC DAO nie jest zawijany funkcje zabezpieczeń obiektów DAO. Należy wywołać metody DAO interfejsów do korzystania z niektórych funkcji zabezpieczeń obiektów DAO. Następująca 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 );
.
.
.
}
Następne cztery przykłady przedstawiają sposób:
Ustawienie systemowej bazy danych
Poniżej jest funkcją próbki do ustawienia bazy danych systemu, który będzie używany przez aplikację. Ta funkcja musi zostać wywołana przed innymi wywołania DAO są wykonywane.
/ / Set systemowej bazy danych / / aparat bazy danych DAO będą wykorzystywać
void SetSystemDB (CString amp; strSystemMDB)
{
COleVariant varSystemDB (strSystemMDB, VT_BSTRT);
/ / Inicjuj DAO dla MFC
AfxDaoInit ();
DAODBEngine * pDBEngine = AfxDaoGetEngine ();
ASSERT (pDBEngine! = NULL);
/ / Wywołać metodę put_SystemDB, aby ustawić / / systemu bazy danych DAO silnika
DAO_CHECK (pDBEngine - > put_SystemDB (varSystemDB.bstrVal));
}
Ustawienia domyślne użytkownika i hasła
Aby ustawić domyślny użytkownik i hasło dla bazy danych systemu, należy użyć następujących funkcji:
void SetDefaultUser (CString amp; strUserName, CString & strPassword)
{
COleVariant varUserName (strUserName, VT_BSTRT);
COleVariant varPassword (strPassword, VT_BSTRT);
DAODBEngine * pDBEngine = AfxDaoGetEngine ();
ASSERT (pDBEngine! = NULL);
/ / Set użytkownika domyślnego:
DAO_CHECK (pDBEngine - > put_DefaultUser (varUserName.bstrVal));
/ / Set domyślne hasło:
DAO_CHECK (pDBEngine - > put_DefaultPassword (varPassword.bstrVal));
}
Trwa zmienianie hasła użytkownika
Aby zmienić hasło użytkownika, użyj następującej 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( );
}
Zmiana hasła.Plik MDB
Aby zmienić hasło.MDB pliku, należy użyć następujących funkcji:
void SetDBPassword (LPCTSTR WPB, LPCTSTR pszOldPassword, LPCTSTR pszNewPassword)
{
nbsp; CDaoDatabase db;
CString strConnect (_T ("; pwd ="));
/ / bazy danych musi być otwarty jako wyłączne
/ / Aby ustawić hasło
DB.Otwórz (WPB, prawda, FAŁSZ, strConnect + pszOldPassword);
COleVariant NoweHasło (pszNewPassword, VT_BSTRT),
StareHasło (pszOldPassword, VT_BSTRT);
DAO_CHECK (db.m_pDAODatabase - > NoweHasło (V_BSTR (& StareHasło),
V_BSTR (& NoweHasło)));
DB.Metody Close();
}
Uwagi techniczne przez liczbę |nbsp; Uwagi techniczne według kategorii