Sdílet prostřednictvím


TN054: Přímé volání rozhraní DAO při používání tříd DAO knihovny MFC

[!POZNÁMKA]

Tak jako jazyk Visual C++ .NET, tak taky prostředí a průvodci jazyka Visual C++ nepodporují rozhraní DAO (přestože třídy rozhraní DAO jsou zahrnuty a lze je stále použít).Společnost Microsoft doporučuje používat Šablon technologie OLE DB nebo rozhraní ODBC a knihovna MFC pro nové projekty.Měli by jste používat pouze rozhraní DAO pro údržbu existujících aplikací.

Pokud používáte databázové třídy knihovny MFC rozhraní DAO, může být situace, kdy je nutné použít přímo rozhraní DAO.Obvykle se k tomu ale poskytuje některé pomocné mechanismy pro usnadnění provedení přímé rozhraní DAO volání simple při kombinování použití tříd knihovny MFC s přímé volání rozhraní DAO knihovny MFC.Provedení DAO přímé volání metody objektu spravované knihovny MFC rozhraní DAO by měly vyžadovat pouze několika řádky kódu.Pokud potřebujete vytvořit a použít objekty DAO, které jsou není spravované knihovny MFC, je třeba udělat trochu více práce ve skutečnosti voláním vydání objektu.Tato technická Poznámka vysvětluje, kdy je vhodné přímo volat rozhraní DAO, co udělat můžete MFC pomocníky a použití rozhraní DAO OLE.Nakonec tato poznámka obsahuje některé funkce vzorku, způsobu přímo volat rozhraní DAO DAO funkce zabezpečení.

Při volání přímé rozhraní DAO

Ve většině případů pro vytvoření přímého volání rozhraní DAO dojít, pokud kolekce je potřeba obnovit nebo jsou při provádění funkce nejsou zabaleny třídou MFC.Nejvýznamnější funkce není vystavena knihovnou MFC je zabezpečení.Pokud chcete implementovat funkce zabezpečení, je třeba použít objekty DAO uživatelů a skupin přímo.Kromě zabezpečení jsou k dispozici pouze několik dalších funkcí DAO MFC nepodporuje.Patří sem funkce replikace záznamů klonování a databáze, jakož i několik pozdní Tvorba DAO.

Stručný přehled implementace rozhraní DAO a MFC

Obtékání knihovny MFC rozhraní DAO značek pomocí objektu DAO snadněji zpracovává mnoho podrobností, takže se nemusíte starat o malé věci.To zahrnuje inicializace OLE, vytváření a správě objektů DAO (zejména objekty kolekce), při kontrole a poskytuje silnými a jednodušší rozhraní (bez varianty nebo BSTR argumenty).Můžete provést přímé volání rozhraní DAO a zároveň využít výhod těchto funkcí.Všechny kódu musíte udělat je volání vydání volání pro všechny objekty vytvořené pomocí přímé rozhraní DAO a Ne upravit všechny ukazatele rozhraní, které knihovny MFC se mohou spoléhat na interně.Například neměňte m_pDAORecordset členem otevřený CDaoRecordset objektu, pokud nevíte, všech vnitřní strukturu.Může však použít m_pDAORecordset rozhraní k volání rozhraní DAO přímo ke získání kolekce polí.V tomto případě m_pDAORecordset člen by být změněn.Stačí zavolat vydání na objekt kolekce polí, až budete hotovi s objektem.

Volá jednodušší popis pomocníky, aby rozhraní DAO

Pomocníci k dispozici k volání rozhraní DAO jednodušší jsou stejné pomocníků, které jsou interně třídy databáze knihovny MFC rozhraní DAO.Tyto pomocníky slouží ke kontrole návratové kódy při přímé volání rozhraní DAO, výstup ladění protokolování, kontrola chyb očekávané a vyvolání příslušné výjimky, pokud je to nutné.Existují dvě základní funkce pomocníka a čtyři makra, která lze namapovat na některou z těchto dvou pomocníků.Nejlepší vysvětlení by bylo jednoduše číst kód.Viz DAO_CHECK, DAO_CHECK_ERROR, DAO_CHECK_MEM, a DAO_TRACE v AFXDAO.H do makra najdete v AfxDaoCheck a AfxDaoTrace v DAOCORE.CPP.

Pomocí rozhraní OLE DAO

Rozhraní OLE pro každý objekt v hierarchii objektů DAO jsou definovány v záhlaví souboru DBDAOINT.H, který je umístěn v adresáři \Program Files\Microsoft 2003\VC7\include Visual Studio .NET.Tato rozhraní poskytují metody, které umožňují manipulovat s celou hierarchii DAO.

Pro mnoho metod v rozhraní DAO, budete potřebovat k manipulaci BSTR objektu (s předponou délky řetězce používané v automatizaci OLE).BSTR Objekt obvykle je zapouzdřený varianty datový typ.Třída knihovny MFC COleVariant sám dědí z varianty datového typu.V závislosti na tom, zda sestavení projektu pro ANSI nebo Unicode, vrátí rozhraní DAO ANSI nebo Unicode BSTRs.Dvě makra, V_BSTR a V_BSTRT, jsou užitečné pro zabezpečit, aby rozhraní DAO získává BSTR očekávaného typu.

V_BSTR bude extrahovat bstrVal členem COleVariant.Toto makro se obvykle používá, když potřebujete předat obsah COleVariant metody rozhraní DAO.Následující fragment kódu ukazuje prohlášení a skutečné použití dvou metod využít výhod rozhraní DAO DAOUser V_BSTR makra:

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

Všimněte si, že VT_BSTRT zadaný v argumentu COleVariant nad konstruktor zajišťuje, že bude ANSI BSTR v COleVariant Pokud sestavíte na verzi ANSI a Unicode aplikace BSTR Unicode verze aplikace.Je to, co očekává DAO.

Toto makro V_BSTRT, bude extrahovat ANSI nebo Unicode bstrVal člen COleVariant v závislosti na typu sestavení (ANSI nebo Unicode).Následující kód ukazuje, jak extrahovat BSTR hodnotu z COleVariant do CString:

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

V_BSTRT makro a jiné techniky, chcete-li otevřít další typy, které jsou uloženy v COleVariant, je znázorněn v ukázkové DAOVIEW.Konkrétně tento překlad se provádí v CCrack::strVARIANT metoda.Tuto metodu, pokud je to možné, převede hodnotu COleVariant do instance CString.

Jednoduchý příklad přímé volání rozhraní DAO

Může nastat situace, pokud je nutné aktualizovat podkladové kolekce objektů DAO.Obvykle to není nutné, ale je jednoduchý postup, pokud je to nezbytné.Při provozu v prostředí s více uživateli, vytváření nových tabledefs je například při kolekce může být nutné aktualizovat.Kolekce tabledefs, v tomto případě mohou být zastaralé.Chcete-li aktualizovat kolekci, stačí zavolat Aktualizovat metoda objektu zejména shromažďování a kontrola chyb:

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

Všimněte si, že právě všechna rozhraní objektu DAO kolekce podrobnosti nezdokumentovaný implementace třídy databáze knihovny MFC rozhraní DAO.

Pomocí objektu DAO přímo pro rozhraní DAO funkce zabezpečení

Databázové třídy knihovny MFC rozhraní DAO nezalamují DAO funkce zabezpečení.Musíte volat metody z rozhraní DAO používat některé funkce zabezpečení rozhraní DAO.Následující funkce nastaví systémovou databázi a potom změní heslo uživatele.Tato funkce volá tři další funkce, které jsou následně definovány.

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

   .
   .
   .

}

Další čtyři příklady ukazují, jak:

  • Nastavit systémové databáze DAO (.MDS soubor).

  • Nastavte výchozího uživatele a heslo.

  • Změňte heslo uživatele.

  • Změnit heslo.Soubor MDB.

Nastavení systémové databáze

Níže je ukázka funkce chcete-li nastavit systémovou databázi, který bude aplikace používat.Tato funkce musí být volána před provedením další volání rozhraní 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 ) );
}

Nastavení výchozího uživatele a heslo

Nastavení výchozího uživatele a heslo pro systémové databáze, použijte následující funkci:

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

Změna uživatelského hesla

Chcete-li změnit heslo uživatele, použijte následující funkci:

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

Změna hesla.Soubor MDB

Chcete-li změnit heslo.MDB soubor, použijte následující funkci:

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

Viz také

Další zdroje

Technické poznámky podle čísel

Technické poznámky podle kategorií