Wenn Sie die MFC-DAO-Datenbankklassen verwenden, kann es Situationen, in denen es notwendig, DAO direkt zu verwenden. In der Regel wird dies nicht der Fall sein, aber MFC lieferte einige Helfer Mechanismen machen direkte DAO Aufrufe einfach zu erleichtern, wenn Sie die Verwendung der MFC-Klassen mit DAO Direktaufrufe zu kombinieren. Durch direkte DAO sollte Aufrufe der Methoden eines verwalteten MFC-DAO-Objekts nur wenige Zeilen Code erforderlich. Benötigen Sie zum Erstellen und Verwenden von DAO-Objekten, die nicht von MFC verwaltet, müssen Sie ein wenig mehr Arbeit zu tun, durch Aufrufen von Release tatsächlich auf das Objekt. Diese technische Hinweis erklärt, wenn Sie DAO direkt aufrufen möchten, was die MFC-Helfer tun können, um Ihnen zu helfen und die DAO-OLE-Schnittstellen veranschaulicht. Schließlich bietet dieser Hinweis Einige Beispielfunktionen des zeigt, wie Sie DAO direkt für die DAO-Sicherheitsfunktionen aufrufen.
Die häufigsten Situationen zur Herstellung von DAO-Anrufe direkt auftreten, wenn Auflistungen müssen aktualisiert werden, oder wenn Sie implementieren Funktionen von MFC nicht umbrochen. Das bedeutendste Feature nicht vom MFC-Typ ist Sicherheit. Wenn Sie Sicherheitsfunktionen implementieren möchten, müssen Sie die DAO-Benutzer und-Gruppen Objekte direkt verwenden. Neben Sicherheit gibt es nur wenige andere DAO nicht unterstützte Features von MFC. Dazu gehören Recordset Klonen und Datenbank Replikation: Features, sowie ein paar späte Ergänzungen zu DAO.
MFC einschließen von DAO macht unter Verwendung von DAO leichter durch viele Details zu behandeln, so dass Sie nicht über die kleinen Dinge kümmern. Dies schließt die Initialisierung von OLE, die Erstellung und Verwaltung von DAO-Objekten (vor allem die Collection-Objekte), Fehlerüberprüfung und eine stark typisierte, einfachere Schnittstelle (keine Variante oder BSTR -Argumente). Sie können direkte DAO telefonieren und diese Features noch nutzen. Ist alles, was der Code tun muss Release aufrufen, für Objekte, die durch direkte Aufrufe von DAO erstellt und nicht ändern die Schnittstellenzeiger, die MFC intern auf verlassen kann. Ändern Sie beispielsweise das M_pDAORecordset Mitglied eines offenen CDaoRecordset -Objekts nicht, wenn Sie alle internen Auswirkungen verstehen. Sie könnte jedoch die M_pDAORecordset -Schnittstelle verwenden, um DAO direkt an die Fields-Auflistung erhalten anzurufen. In diesem Fall würde der M_pDAORecordset Member nicht geändert werden. Sie müssen einfach nur Release auf das Collection-Objekt Felder aufrufen, wenn Sie mit dem Objekt fertig sind.
Die Helfer ermöglichen DAO einfacher Aufruf sind die gleichen Helfer, die intern in den MFC DAO-Datenbankklassen verwendet werden. Diese Helfer werden verwendet, um die Rückgabecodes überprüfen, wenn eine direkte DAO, telefonieren, protokollieren Debug-Ausgabe, erwarteten Fehlerprüfung und entsprechende Ausnahmen auslösen, wenn nötig. Es gibt zwei zugrunde liegenden Hilfsfunktionen und vier Makros, mit denen man diese zwei Helfer zugeordnet. Die beste Erklärung wäre, einfach den Code zu lesen. Finden Sie unter DAO_CHECK, DAO_CHECK_ERROR, DAO_CHECK_MEMund DAO_TRACE in AFXDAO.H und finden die Makros finden Sie unter AfxDaoCheck und AfxDaoTrace in DAOCORE.CPP.
Die OLE-Schnittstellen für jedes Objekt in der DAO-Objekthierarchie sind in der Headerdatei DBDAOINT definiert.H, die sich im Verzeichnis \Program Files\DevStudio\VC\include befindet. Diese Schnittstellen stellen Methoden, mit denen Sie die gesamte DAO-Hierarchie bearbeiten.
Für viele der Methoden in der DAO-Schnittstellen müssen Sie eine BSTR -Objekt (ein Längenpräfix String in OLE-Automatisierung verwendet) zu manipulieren. Das BSTR -Objekt wird in der Regel in der VARIANT -Datentyp gekapselt. Die MFC-Klasse COleVariant selbst erbt von der VARIANT -Datentyp. Je nachdem, ob Sie Ihr Projekt für ANSI oder Unicode erstellen werden die DAO-Schnittstellen ANSI- oder Unicode- BSTRs zurückzugeben. Zwei Makros, V_BSTR und V_BSTRT, eignen sich zur Sicherstellung, dass die DAO-Schnittstelle den BSTR des erwarteten Typs ruft.
V_BSTR wird das BstrVal Mitglied einer COleVariantextrahieren. Dieses Makro wird normalerweise verwendet, wenn Sie den Inhalt des einem COleVariant um eine Methode eines DAO-Schnittstelle übergeben. Das folgende Codefragment zeigt die Erklärungen und die tatsächliche Nutzung für zwei Methoden der DAOUser DAO-Schnittstelle, die das V_BSTR -Makro nutzen:
COleVariant VarOldName;
COleVariant VarNewName (_T("NewUser"), VT_BSTRT);
/ / Code einen gültigen Wert ausgelassen pUser zuweisen
DAOUser * pUser = NULL;
/ / Diese Methode Erklärungen wurden von DBDAOINT genommen.H
/ / STDMETHOD(get_Name) (FAR THIS_ BSTR * 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)))
Anmerkung, die das VT_BSTRT -Argument im Konstruktor COleVariant oben angegebene sorgt, dass es dafür wird ein ANSI- BSTR in der COleVariant sein, wenn Sie eine ANSI-Version Ihrer Anwendung und einer Uunicode BSTR für eine Unicode-Version der Anwendung erstellen. Dies ist, was erwartet DAO.
Das anderen Makro, V_BSTRT, extrahiert eine ANSI- oder Unicode- BstrVal -Mitglied des COleVariant je nach Art der Build (ANSI oder Unicode). Der folgende Code veranschaulicht, wie den BSTR -Wert aus einem COleVariant in CString extrahieren:
COleVariant VarName (_T ("MyName"), VT_BSTRT);
CString str = V_BSTRT (&Amp; VarName)
Das V_BSTRT -Makro, zusammen mit anderen Tricks zu knacken öffnen andere Typen gespeichert innerhalb COleVariant, zeigt sich in der DAOVIEW-Beispiels auf der Visual C++-CD enthalten. Diese Übersetzung wird insbesondere in der CCrack::strVARIANT -Methode ausgeführt. Diese Methode übersetzt wo möglich, den Wert von einem COleVariant in eine Instanz von CString.
Situationen können entstehen, wenn die zugrunde liegenden DAO-Auflistungsobjekte aktualisieren muss. Normalerweise sollte dies nicht nötig sein, aber es ist ein einfaches Verfahren, wenn es notwendig ist. Ein Beispiel wenn eine Auflistung aktualisiert werden muss möglicherweise ist beim Betrieb in einer Mehrbenutzer-Umgebung mit mehreren Benutzern neue Tabledefs erstellen. In diesem Fall könnte die Tabledefs-Auflistung veralten. Um die Sammlung zu aktualisieren, müssen Sie einfach rufen Sie die Refresh -Methode des Objekts bestimmte Sammlung und auf Fehler prüfen:
DAO_CHECK (pMyDaoDatabase-Gt;
M_pDAOTableDefs - > aktualisieren ())
Beachten Sie, dass alle DAO-Auflistung-Objektschnittstellen undokumentierte Implementierungsdetails für die MFC-DAO-Datenbankklassen derzeit.
Die MFC-DAO-Datenbankklassen die DAO-Sicherheitsfunktionen nicht umbrochen. Sie müssen Methoden der DAO-Schnittstellen verwenden einige DAO-Sicherheitsfunktionen aufrufen. Die folgende Funktion legt die Systemdatenbank und dann ändert das Kennwort des Benutzers. Diese Funktion ruft drei andere Funktionen, die später definiert werden.
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 );
.
.
.
}
Die nächsten vier Beispielen wird gezeigt, wie Sie:
Festlegen der Systemdatenbank
Unten ist eine Beispiel-Funktion die Systemdatenbank festlegen, die von einer Anwendung verwendet werden. Diese Funktion muss aufgerufen werden, bevor anderer DAO Anrufe getätigt werden.
/ / Setzen der Systemdatenbank, die das / / DAO-Datenbankmodul verwendet eine
privatevoid SetSystemDB (CString Amp; StrSystemMDB)
{
COleVariant VarSystemDB (StrSystemMDB, VT_BSTRT);
/ / Initialisieren von DAO für MFC
AfxDaoInit ();
DAODBEngine * pDBEngine = AfxDaoGetEngine ();
ASSERT (pDBEngine! = NULL);
/ / Aufruf der Put_SystemDB Methode zum Festlegen der / / System Datenbank für DAO-Engine
DAO_CHECK (pDBEngine - > Put_SystemDB (varSystemDB.bstrVal));
}
Standardbenutzer und Passwort einstellen
Um den Standard-Benutzer und das Kennwort für eine Systemdatenbank festzulegen, verwenden Sie die folgende Funktion:
void SetDefaultUser (CString Amp; StrUserName, CString & StrPassword)
{
COleVariant VarUserName (StrUserName, VT_BSTRT);
COleVariant VarPassword (StrPassword, VT_BSTRT);
DAODBEngine * pDBEngine = AfxDaoGetEngine ();
ASSERT (pDBEngine! = NULL);
/ / Set Standard-Benutzer:
DAO_CHECK (pDBEngine - > Put_DefaultUser (varUserName.bstrVal));
/ / Set Standard-Passwort:
DAO_CHECK (pDBEngine - > Put_DefaultPassword (varPassword.bstrVal));
}
Ändern des Kennworts eines Benutzers
Um das Kennwort eines Benutzers zu ändern, verwenden Sie die folgende Funktion:
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( );
}
Ändern des Kennworts ein.MDB-Datei
Ändern Sie das Kennwort ein.MDB Datei, verwenden Sie die folgende Funktion:
privatevoid SetDBPassword (LPCTSTR pDB, LPCTSTR PszOldPassword, LPCTSTR PszNewPassword)
{
Nbsp; CDaoDatabase Db;
CString StrConnect (_T ("; Pwd ="));
/ / die Datenbank als exklusiv geöffnet werden muss
/ / zum Festlegen eines Kennworts
DB.Öffnen Sie (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();
}
Technische Hinweise von &Nummer |nbsp; Technische Hinweise nach Kategorie