TN054: Volání přímo při použití tříd MFC DAO DAO
[!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 Šablony technologie OLE DB nebo 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 rozhraní DAO přímo.Obvykle se nebude jednat o tento případ, ale knihovny MFC má k dispozici některé pomocné mechanismy usnadňující vytváření přímého DAO volání simple při kombinování použití tříd knihovny MFC pomocí přímého volání rozhraní DAO.Provedení přímé DAO volání metody objektu spravované knihovny MFC rozhraní DAO by měl vyžadovat pouze několika řádky kódu.Pokud potřebujete vytvořit a používat objekty DAO, které jsou Ne spravované knihovnou MFC, budete muset udělat trochu více práce ve skutečnosti voláním vydání objektu.Tato technická Poznámka vysvětluje pravděpodobně chcete-li přímo volat rozhraní DAO, co MFC pomocníky jak vám pomoci a používání rozhraní DAO OLE.Tato poznámka nakonec poskytuje funkce vzorku, způsobu přímo volat rozhraní DAO DAO funkce zabezpečení.
Kdy volat přímo rozhraní DAO
Ve většině případů pro vytvoření přímého volání rozhraní DAO dojít při kolekce není potřeba obnovit nebo jsou při provádění funkce, nikoliv obalena knihovnou MFC.Nejvýznamnější funkce, které nejsou vystaveny knihovnou MFC se zabezpečení.Pokud chcete implementovat funkce zabezpečení, budete muset přímo pomocí objektů DAO uživatelů a skupin.Kromě zabezpečení jsou k dispozici pouze několik dalších rozhraní DAO funkce nepodporované aplikací knihovny MFC.Mezi ně patří funkce replikace záznamů klonování a databáze, jakož i několik pozdní dodatky k rozhraní DAO.
Stručný přehled rozhraní DAO a implementace MFC
Balení knihovny MFC rozhraní DAO provádí pomocí rozhraní DAO snadnější zpracování mnoho podrobností, takže se nemusíte obávat, že málo věcíTo zahrnuje inicializace OLE, vytváření a správě objektů DAO (zejména objekty kolekce), chyby, kontrola a zajištění silného typu, jednodušší rozhraní (bez varianty nebo BSTR argumenty).Můžete přímo volat rozhraní DAO a zároveň využít výhod těchto funkcí.Všechny nutné váš kód je volání vydání pro všechny objekty vytvořené pomocí rozhraní DAO přímé volání a Ne upravit všechny ukazatele rozhraní, které knihovny MFC může spolehnout na interně.Například neměňte m_pDAORecordset členem otevřený CDaoRecordset objekt, pokud nevíte, všechny vnitřní strukturu.Může však použít m_pDAORecordset rozhraní volat rozhraní DAO přímo ke získání kolekce polí.V tomto případě m_pDAORecordset člen nebude změněn.Stačí zavolat vydání na objekt kolekce polí, až budete hotovi s objektem.
Popis pomocníky k rozhraní DAO volá jednodušší
Pomocníky k dispozici tak, aby volání rozhraní DAO jednodušší jsou stejné pomocníky, které jsou použity interně v třídy databáze knihovny MFC rozhraní DAO.Tyto pomocníky slouží ke kontrole návratové kódy při vytváření přímého volání rozhraní DAO, protokolování výstupu ladě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é jsou mapovány na jednu z těchto dvou pomocníky.Nejlepší vysvětlení by jednoduše číst kód.Viz DAO_CHECK, DAO_CHECK_ERROR, DAO_CHECK_MEM, a DAO_TRACE v AFXDAO.H Zobrazit makra a viz AfxDaoCheck a AfxDaoTrace v DAOCORE.CPP.
Pomocí rozhraní DAO OLE
Rozhraní OLE pro každý objekt v hierarchii objektů DAO jsou definovány v souboru hlaviček 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í pracovat s celou hierarchii DAO.
Pro mnoho metod v rozhraní DAO, budete muset manipulovat BSTR objekt (s předponou délky řetězce používané v automatizaci OLE).BSTR Objektu je obvykle zapouzdřený v varianty datového typu.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, bude vrátí rozhraní DAO ANSI nebo Unicode BSTRs.Dvě makra, V_BSTR a V_BSTRT, jsou užitečné pro pracoviště, která rozhraní DAO získá BSTR očekávaného typu.
V_BSTR bude extrahovat bstrVal člen COleVariant.Toto makro se obvykle používá v případě, že potřebujete předat obsah COleVariant metody rozhraní DAO.Následující fragment kódu ukazuje prohlášení a skutečné použití pro dvě metody 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 je zajištěno, že bude ANSI BSTR v COleVariant -li vytvořit verze aplikace ANSI a Unicode aplikace BSTR Unicode verze aplikace.Je to, co očekává rozhraní DAO.
Jiné makro V_BSTRT, bude extrahovat znaky ANSI nebo Unicode bstrVal člen COleVariant v závislosti na typu sestavení (ANSI nebo Unicode).Následující kód ukazuje, jak lze extrahovat BSTR hodnota z COleVariant do CString:
COleVariant varName( _T( "MyName" ), VT_BSTRT );
CString str = V_BSTRT( &varName );
V_BSTRT makro, kromě jiných technikách, chcete-li otevřít další typy, které jsou uloženy v COleVariant, je znázorněn v ukázkové DAOVIEW.Konkrétně je tento převod uskutečněn v CCrack::strVARIANT metoda.Tuto metodu, pokud je to možné, převede hodnotu COleVariant do instance CString.
Jednoduchý příklad přímého volání rozhraní DAO
Může nastat situace, kdy bude nutné aktualizovat podkladové kolekci objektů DAO.Obvykle to není nutné, ale je jednoduchý postup, pokud je nezbytné.Je například při kolekce může být nutné aktualizovat pracuje v prostředí s více uživateli, vytváření nových tabledefs.Kolekce tabledefs, v tomto případě mohou být zastaralé.Chcete-li aktualizovat kolekci, stačí zavolat aktualizace metodu objektu konkrétní kolekce a kontrola chyb:
DAO_CHECK( pMyDaoDatabase->
m_pDAOTableDefs->Refresh( ) );
Všimněte si, že právě všechny rozhraní DAO pro objekty kolekce nezdokumentovaný implementační podrobnosti databázové třídy knihovny MFC rozhraní DAO.
Pomocí objektu DAO přímo pro rozhraní DAO funkce zabezpečení
Databázové třídy knihovny MFC rozhraní DAO není zalomen DAO funkce zabezpečení.Musíte volat metody rozhraní DAO, chcete-li 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:
Nastavte systémovou databázi rozhraní DAO (.Soubor MDW).
Nastavení výchozího uživatele a heslo.
Změňte heslo uživatele.
Změnit heslo.Soubor MDB.
Nastavení systémové databáze
Následuje ukázka funkce nastavení databáze systému, který bude použit v aplikaci.Tato funkce musí být volána před provedením jakékoli jiné 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émovou databázi, 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 hesla uživatele
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 z.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();
}