TN054: MFC DAO Sınıflarını Kullanırken DAO'yu Doğrudan Çağırma
Dekont
DAO, Access veritabanlarıyla birlikte kullanılır ve Office 2013 aracılığıyla desteklenir. DAO 3.6 son sürümdür ve eski olarak kabul edilir. Visual C++ ortamı ve sihirbazları DAO'yu desteklemez (DAO sınıfları dahil olsa da ve bunları kullanmaya devam edebilirsiniz). Microsoft, yeni projeler için OLE DB Şablonları veya ODBC ve MFC kullanmanızı önerir. DAO'yu yalnızca mevcut uygulamaları korumak için kullanmanız gerekir.
MFC DAO veritabanı sınıflarını kullanırken, DAO'yu doğrudan kullanmanın gerekli olduğu durumlar olabilir. Genellikle böyle olmaz, ancak MFC, MFC sınıflarının kullanımını doğrudan DAO çağrılarıyla birleştirirken doğrudan DAO çağrılarını basit hale getirmek için bazı yardımcı mekanizmalar sağlamıştır. MFC tarafından yönetilen bir DAO nesnesinin yöntemlerine doğrudan DAO çağrıları yapmak için yalnızca birkaç kod satırı gerekir. MFC tarafından yönetilmeyen DAO nesneleri oluşturmanız ve kullanmanız gerekiyorsa, nesne üzerinde gerçekten çağırarak Release
biraz daha fazla iş yapmanız gerekir. Bu teknik notta DAO'yu doğrudan ne zaman çağırmak isteyebileceğiniz, MFC yardımcılarının size yardımcı olmak için yapabilecekleri ve DAO OLE arabirimlerinin nasıl kullanılacağı açıklanmaktadır. Son olarak bu not, DAO güvenlik özellikleri için DAO'yu doğrudan çağırmayı gösteren bazı örnek işlevler sağlar.
Doğrudan DAO Çağrıları Ne Zaman Yapılır?
Doğrudan DAO çağrıları yapmak için en yaygın durumlar koleksiyonların yenilenmesi gerektiğinde veya MFC tarafından sarmalanmamış özellikleri uyguladığınızda ortaya çıkar. MFC tarafından kullanıma sunulmayan en önemli özellik güvenliktir. Güvenlik özelliklerini uygulamak istiyorsanız, DAO Kullanıcılarını ve Grup nesnelerini doğrudan kullanmanız gerekir. Güvenliğin yanı sıra, MFC tarafından desteklenmeyen yalnızca birkaç DAO özelliği daha vardır. Bunlar kayıt kümesi kopyalama ve veritabanı çoğaltma özelliklerinin yanı sıra DAO'ya birkaç geç ekleme içerir.
DAO ve MFC'nin Uygulamasına Kısa Bir Genel Bakış
MFC'nin DAO sarmalama işlemi, ayrıntıların çoğunu ele alarak DAO'yu kullanmayı kolaylaştırır, böylece küçük şeyler hakkında endişelenmenize gerek kalmaz. Bu, OLE'nin başlatılmasını, DAO nesnelerinin (özellikle koleksiyon nesnelerinin) oluşturulmasını ve yönetilmesini, hata denetimini ve kesin olarak belirlenmiş, daha basit bir arabirim (DEĞIŞKEN veya BSTR
bağımsız değişken olmadan) sağlamayı içerir. Doğrudan DAO çağrıları yapabilir ve yine de bu özelliklerden yararlanabilirsiniz. Kodunuzun tek yapması gereken, doğrudan DAO çağrıları tarafından oluşturulan nesneleri çağırmak Release
ve MFC'nin dahili olarak güvenebileceği arabirim işaretçilerinden hiçbirini değiştirmek değildir . Örneğin, tüm iç sonuçları anlamadığınız sürece açık CDaoRecordset
bir nesnenin m_pDAORecordset üyesini değiştirmeyin. Ancak alanlar koleksiyonunu almak için dao'yu doğrudan çağırmak için m_pDAORecordset arabirimini kullanabilirsiniz. Bu durumda m_pDAORecordset üyesi değiştirilmez. Nesneyle işiniz bittiğinde Alanlar koleksiyonu nesnesini çağırmanız Release
yeterlidir.
DAO Çağrılarını Kolaylaştıracak Yardımcıların Açıklaması
DAO çağrısını kolaylaştırmak için sağlanan yardımcılar, MFC DAO Veritabanı sınıflarında dahili olarak kullanılan yardımcılarla aynıdır. Bu yardımcılar, doğrudan DAO çağrısı yaparken, hata ayıklama çıkışını günlüğe kaydederken, beklenen hataları denetlerken ve gerekirse uygun özel durumlar oluştururken dönüş kodlarını denetlemek için kullanılır. Bu iki yardımcıdan biriyle eşleşen iki temel yardımcı işlev ve dört makro vardır. En iyi açıklama yalnızca kodu okumaktır. Bkz. AFXDAO'da DAO_CHECK, DAO_CHECK_ERROR, DAO_CHECK_MEM ve DAO_TRACE. H ile makroları görebilir ve DAOCORE'da AfxDaoCheck ve AfxDaoTrace değerlerini görebilirsiniz. CPP.
DAO OLE Arabirimlerini Kullanma
DAO nesne hiyerarşisindeki her nesne için OLE arabirimleri DBDAOINT üst bilgi dosyasında tanımlanır. \Program Files\Microsoft Visual Studio .NET 2003\VC7\include dizininde bulunan H. Bu arabirimler, TÜM DAO hiyerarşisini işlemenize olanak sağlayan yöntemler sağlar.
DAO arabirimlerindeki yöntemlerin birçoğu için bir BSTR
nesneyi (OLE otomasyonunda kullanılan uzunluk ön ekli dize) işlemeniz gerekir. BSTR
Nesnesi genellikle VARIANT veri türü içinde kapsüllenmiş. MFC sınıfının COleVariant
kendisi VARIANT veri türünden devralır. Projenizi ANSI veya Unicode için oluşturup oluşturmadığınıza bağlı olarak, DAO arabirimleri ANSI veya Unicode BSTR
s döndürür. V_BSTR ve V_BSTRT iki makro, DAO arabiriminin beklenen türe sahip olduğunu güvenceye alma BSTR
konusunda yararlıdır.
V_BSTR bir COleVariant
bstrVal üyesini ayıklar. Bu makro genellikle içeriğini bir COleVariant
DAO arabiriminin yöntemine geçirmeniz gerektiğinde kullanılır. Aşağıdaki kod parçası, V_BSTR makrodan yararlanan DAO DAOUser arabiriminin iki yöntemi için hem bildirimleri hem de gerçek kullanımı gösterir:
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)));
Yukarıdaki oluşturucuda belirtilen bağımsız değişkenin COleVariant
VT_BSTRT
, uygulamanızın ANSI sürümünü ve uygulamanızın Unicode sürümü için Unicode BSTR
oluşturursanız içinde bir ANSI BSTR
COleVariant
olmasını sağladığını unutmayın. DAO bunu bekliyor.
V_BSTRT diğer makro, derleme türüne (ANSI veya Unicode) bağlı olarak anSI veya Unicode bstrVal üyesini COleVariant
ayıklar. Aşağıdaki kod, bir içindeki değerinin BSTR
COleVariant
CString
nasıl ayıklanması işlemini gösterir:
COleVariant varName(_T("MyName"), VT_BSTRT);
CString str = V_BSTRT(&varName);
V_BSTRT makro, içinde COleVariant
depolanan diğer türleri açmaya yönelik diğer tekniklerle birlikte DAOVIEW örneğinde gösterilmiştir. Özellikle, bu çeviri yönteminde CCrack::strVARIANT
gerçekleştirilir. Bu yöntem mümkün olduğunda değerini bir örneğine CString
çevirirCOleVariant
.
DAO'ya Doğrudan ÇağrıNın Basit Örneği
Temel alınan DAO koleksiyon nesnelerini yenilemek gerektiğinde durumlar ortaya çıkabilir. Normalde, bu gerekli olmamalıdır, ancak gerekirse basit bir prosedürdür. Bir koleksiyonun yenilenmesi gerekebileceği bir örnek, birden çok kullanıcının yeni tablo tanımları oluşturduğu çok kullanıcılı bir ortamda çalışmadır. Bu durumda tabledefs koleksiyonunuz eskimiş olabilir. Koleksiyonu yenilemek için belirli bir koleksiyon nesnesinin Refresh
yöntemini çağırmanız ve hataları denetlemeniz yeterlidir:
DAO_CHECK(pMyDaoDatabase->m_pDAOTableDefs->Refresh());
Şu anda tüm DAO koleksiyonu nesne arabirimlerinin MFC DAO veritabanı sınıflarının belgelenmemiş uygulama ayrıntıları olduğunu unutmayın.
DAO Güvenlik Özellikleri için DOĞRUDAN DAO Kullanma
MFC DAO veritabanı sınıfları DAO güvenlik özelliklerini sarmalamaz. Bazı DAO güvenlik özelliklerini kullanmak için DAO arabirimlerinin yöntemlerini çağırmanız gerekir. Aşağıdaki işlev sistem veritabanını ayarlar ve ardından kullanıcının parolasını değiştirir. Bu işlev, daha sonra tanımlanan diğer üç işlevi çağırır.
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 effect.
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);
// ...
}
Sonraki dört örnek aşağıdakilerin nasıl yapılacağını gösterir:
Sistem DAO veritabanını (. MDW dosyası).
Varsayılan kullanıcı ve parolayı ayarlayın.
Kullanıcının parolasını değiştirin.
parolasını değiştirme. MDB dosyası.
Sistem Veritabanını Ayarlama
Aşağıda, bir uygulama tarafından kullanılacak sistem veritabanını ayarlamaya yönelik örnek bir işlev verilmiştir. Diğer DAO çağrıları yapılmadan önce bu işlev çağrılmalıdır.
// 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));
}
Varsayılan Kullanıcı ve Parolayı Ayarlama
Sistem veritabanı için varsayılan kullanıcı ve parolayı ayarlamak için aşağıdaki işlevi kullanın:
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));
}
Kullanıcının Parolasını Değiştirme
Kullanıcının parolasını değiştirmek için aşağıdaki işlevi kullanın:
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->getcount(&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();
}
Parolasını değiştirme. MDB Dosyası
Parolasını değiştirmek için. MDB dosyası, aşağıdaki işlevi kullanın:
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();
}
Ayrıca bkz.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin