Freigeben über


TN054: DAO direkt aufrufen bei Verwendung von MFC-DAO-Klassen

HinweisHinweis

Ab Visual C++ .NET wird DAO von der Visual C++-Umgebung und den Assistenten nicht mehr unterstützt. (Die DAO-Klassen sind allerdings weiterhin enthalten und können verwendet werden.)Microsoft empfiehlt, dass Sie OLE DB-Vorlagen oder ODBC und MFC für neue Projekte verwenden.DAO sollte lediglich zur Verwaltung bereits bestehender Anwendungen eingesetzt werden.

Wenn Sie die MFC-DAO-Datenbankklassen verwendet, kann es Situationen, in denen es erforderlich ist, DAO direkt zu verwenden.Normalerweise ist dies nicht der Fall, aber MFC verfügt über mehrere Hilfemechanismen erzeugt, um die direkte, DAO-Aufrufe vereinfachen zu vereinfachen, wenn die Verwendung von MFC-Klassen mit direkten DAO-Aufrufen kombinierte.Die Durchführung von direkten DAO-Aufrufen an Methoden eines MFC-verwalteten DAO-Objekts sollte nur einige Codezeilen erfordern.Wenn Sie DAO-Objekte erstellen und verwenden müssen, die nicht von MFC verwaltet werden, müssen Sie weitere Arbeit etwas ausführen, indem Sie tatsächlich Release für das Objekt aufrufen.In diesem technischen Hinweis erläutert, als Sie DAO direkt aufrufen sollten, was die MFC-Hilfen ausführen können, mit denen und wie die Schnittstellen DAO OLE verwendet.Schließlich enthält dieser Hinweis einige Beispielfunktionen, die wie DAO direkt für DAO-Sicherheitsmerkmale anzeigen, aufgerufen.

Wann Sie direkte DAO-Aufrufe macht

Die häufigsten Situationen für das Festlegen der direkten DAO-Aufrufen treten auf, wenn Auflistungen aktualisiert werden müssen, oder wenn Sie die Funktionen implementieren, die nicht von MFC umschlossen werden.Die wichtigste Funktion, die nicht von MFC verfügbar gemacht wird, ist Sicherheit.Wenn Sie Sicherheitsfunktionen implementieren möchten, müssen Sie die DAO-Benutzer-undGruppenobjekte direkt verwenden.Neben Sicherheit gibt es nur einige andere DAO-Funktionen, die nicht von MFC unterstützt werden.Diese schließen Recordsetklonen- und -Datenbankreplikationsfunktionen sowie einige späte Ergänzungen zu DAO ein.

Eine kurze Übersicht über DAO- und MFC-Implementierung

Umbruch von MFC DAO macht mit DAO erleichtert, indem er viele der Details behandelt, müssen Sie sich um Kleinigkeiten zu kümmern.Dies schließt die Initialisierung von OLE, die Erstellung und Verwaltung der DAO-Objekte (insbesondere die Auflistungsobjekte), die Fehlerprüfung und Bereitstellen einer stark typisierten, einfacheren Schnittstelle ein (kein VARIANT oder BSTR-Argumente).Sie können direkte DAO-Aufrufe ausführen und diese Funktionen weiterhin nutzen.der gesamte Code muss besteht darin, Release für alle Objekte aufzurufen, die durch direkte DAO-Aufrufe und alle von Schnittstellenzeigern nicht ändern erstellt werden, dass MFC möglicherweise an intern beruht.Ändern Sie beispielsweise nicht den m_pDAORecordset-Member eines offenen CDaoRecordset-Objekts, es sei denn, Sie alle internen Verzweigungen verstehen.Sie können die m_pDAORecordset-Schnittstelle jedoch verwenden, um DAO direkt aufzurufen, um die Feldauflistung abzurufen.In diesem Fall wird der m_pDAORecordset-Member nicht geändert.Sie müssen Release auf dem Feldauflistungsobjekt einfach aufrufen, wenn Sie mit dem - Objekt beendet werden.

Beschreibung der unterstützt, von DAO-Aufrufen zu vereinfachen

Der unterstützt, die bereitgestellt werden, um das Aufrufen von DAO einfacher zu machen, sind die gleichen erleichtert, die intern in den MFC-DAO-Datenbankklassen verwendet werden.Diese unterstützt werden verwendet, um die Rückgabecodes zu überprüfen, wenn Sie einen direkten DAO-Aufruf macht überprüft, Debugausgabe protokolliert, für erwartete Fehler, und ggf. entsprechende Ausnahmen auslöst.Es gibt zwei zugrunde liegende Hilfsfunktionen und vier Makros, die zu einer dieser beiden unterstützt zuordnen.Die beste Erläuterung würde, den Code einfach zu lesen sein.Siehe DAO_CHECK, DAO_CHECK_ERROR, DAO_CHECK_MEM und DAO_TRACE in AFXDAO.H, um die Makros zu finden, und finden Sie unter AfxDaoCheck und AfxDaoTrace in DAOCORE.CPP.

Mithilfe der Schnittstellen DAO OLE

Die OLE-Schnittstellen für jedes Objekt in der DAO-Objekthierarchie werden in der Headerdatei DBDAOINT.H definiert, die im Verzeichnis \Programme\Microsoft Visual Studio .NET 2003\VC7\include gefunden wird.Diese Schnittstellen stellen Methoden, die es Ihnen ermöglichen, die gesamte DAO-Hierarchie zu bearbeiten.

Für viele Methoden in den DAO-Schnittstellen, müssen Sie ein BSTR-Objekt (eine Zeichenfolge Länge-vorangestellte verwendet in der OLE-Automatisierung) bearbeiten.Das - Objekt BSTR wird normalerweise innerhalb des VARIANT Datentyps gekapselt.Die MFC-Klasse COleVariant selbst erbt vom VARIANT Datentyp.Je nachdem, ob Sie das Projekt für ANSI oder Unicode erstellen, geben die DAO-Schnittstellen ANSI oder Unicode BSTR S. zurück.Zwei Makros, V_BSTR und V_BSTRT, sind zum Gewährleisten nützlich, dass die DAO-Schnittstelle BSTR des erwarteten Typs abruft.

V_BSTR extrahiert den bstrVal-Member von COleVariant.Dieses Makro wird normalerweise verwendet, wenn Sie den Inhalt von COleVariant an eine Methode einer DAO-Schnittstelle übergeben müssen.Das folgende Codefragment zeigt die Deklaration und Verwendung tatsächliche für zwei Methoden der Schnittstelle DAO DAOUser an, die das V_BSTR-Makro nutzen:

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

Beachten Sie, dass das VT_BSTRT-Argument, das im obigen COleVariant-Konstruktor angegeben wird, wird sichergestellt, dass es ANSI BSTR in COleVariant gibt, wenn Sie eine ANSI-Version der Anwendung und einen Unicode BSTR für eine Unicodeversion der Anwendung erstellen.Dies ist, was DAO erwartet.

Das andere Makro, V_BSTRT, extrahiert entweder einen ANSI- oder einen Unicode-bstrVal-Member von COleVariant je nach Art des Builds (ANSI oder Unicode).Der folgende Code zeigt, wie der BSTR-Wert von COleVariant in CString abstrahiert:

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

Das V_BSTRT-Makro, zusammen mit anderen Verfahren, andere Typen zu öffnen, die in COleVariant gespeichert werden, wird im DAOVIEW-Beispiel veranschaulicht.Insbesondere wird diese Übersetzung in der CCrack::strVARIANT-Methode ausgeführt.Diese Methode, übersetzt nach Möglichkeit den Wert von COleVariant in eine Instanz von CString.

Einfaches Beispiel eines direkten Aufruf von DAO

Situationen können möglicherweise, wenn es erforderlich ist, die zugrunde liegenden DAO-Auflistungsobjekte zu aktualisieren.Normalerweise sollte dies nicht notwendig sein, jedoch eine einfache Prozedur, wenn es erforderlich ist.Ein Beispiel, als Auflistung möglicherweise aktualisiert werden muss, ist beim Funktionieren in einer Mehrbenutzerumgebung mit den mehrere Benutzer, die neue tabledefs erstellen.In diesem Fall kann die tabledefs Auflistung veraltet.Um die Auflistung zu aktualisieren, müssen Sie einfach die - Methode des Aktualisieren bestimmten Auflistungsobjekts und Überprüfung für Fehler aufrufen:

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

Beachten Sie, dass nur alle DAO-Auflistungsobjektschnittstellen nicht dokumentierten Implementierungsdetails der MFC-DAO-Datenbankklassen sind.

Mit DAO direkt für DAO-Sicherheitsmerkmale

Die MFC-DAO-Datenbankklassen binden nicht DAO-Sicherheitsmerkmale ein.Sie müssen Methoden aus DAO-Schnittstellen aufrufen, um einige DAO-Sicherheitsmerkmale zu verwenden.Die folgende Funktion legt die Systemdatenbank fest und inwiefern das Kennwort des Benutzers.Diese Funktion ruft drei weitere Funktionen, die anschließend 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 folgenden vier Beispiele zeigen, wie zu:

  • Legen Sie die System DAO-Datenbank fest (.MDW-Datei).

  • Legen Sie den Standard Benutzer und das Kennwort fest.

  • Ändern Sie das Kennwort eines Benutzers.

  • Ändern Sie das Kennwort einer MDB-Datei.

1s0dx3s7.collapse_all(de-de,VS.110).gifFestlegen der Systemdatenbank

Unten ist eine Beispielfunktion, um die Systemdatenbank festzulegen, die von einer Anwendung verwendet wird.Diese Funktion muss aufgerufen werden, bevor alle anderen DAO-Aufrufe gemacht werden.

// 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(de-de,VS.110).gifFestlegen des standardmäßigen Benutzers und des Kennworts

Um den standardmäßigen Benutzer und das Kennwort für eine Systemdatenbank festzulegen, verwenden Sie die folgende Funktion:

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(de-de,VS.110).gifÄndern eines Kennworts des Benutzers

Um ein Kennwort des 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( );
}

1s0dx3s7.collapse_all(de-de,VS.110).gifÄndern des Kennworts einer MDB-Datei

Um das Kennwort einer MDB-Datei zu ändern, verwenden Sie die folgende Funktion:

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

Siehe auch

Weitere Ressourcen

Technische Hinweise durch Zahl

Technische Hinweise nach Kategorie