Aracılığıyla paylaş


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 BSTRs 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 COleVariantbstrVal ü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 COleVariantVT_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 BSTRCOleVariant 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 BSTRCOleVariantCStringnasıl ayıklanması işlemini gösterir:

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

V_BSTRT makro, içinde COleVariantdepolanan 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.

Sayıya Göre Teknik Notlar
Kategoriye Göre Teknik Notlar