TN054: dao mfc dao sınıflar doğrudan kullanırken arama

Mfc dao veritabanı sınıflarını kullanırken, dao doğrudan kullanmak için gerekli olduğu durumlar olabilir. Genellikle bu durumda olmayacaktır, ama mfc yapmadan doğrudan dao aramalarını basit ne zaman mfc sınıfların doğrudan dao çağrıları ile birlikte kolaylaştırmak için bazı yardımcı mekanizmaları sağlamıştır. Doğrudan dao yapma yöntemlerine dao mfc tarafından yönetilen nesne kod sadece birkaç satır istemeniz gerekir. dao nesneleri oluşturmak ihtiyacınız olmayan mfc tarafından yönetilen, biraz daha fazla iş aslında nesne açıklaması ' i arayarak yapmak zorunda. Bu teknik not dao doğrudan aramak istediğinizde, mfc yardımcıları yardımcı olmak için neler yapabileceğini ve dao ole arabirimlerin nasıl açıklar. Son olarak, bu Not dao doğrudan dao güvenlik özellikleri için arama gösterilen bazı örnek işlevleri sağlar.

Ne zaman doğrudan dao arama yapmak için

Koleksiyonların yenilenmesi gerektiğinde doğrudan dao aramalar yapmak için en yaygın durumlar meydana veya ne zaman mfc tarafından sarılmış değil özellikleri uygulama. mfc tarafından maruz değil en önemli güvenlik özelliğidir. Güvenlik özelliklerini uygulamak istiyorsanız, dao kullanıcı ve grup nesneleri doğrudan kullanmanız gerekecektir. Güvenlik, mfc tarafından desteklenen değil sadece birkaç diğer dao özellikleri vardır. Bu recordset Klonlama ve veritabanı çoğaltma özelliklerinin yanı sıra, dao birkaç geç eklemeler içerir.

Dao ve MFC'ın uygulaması kısa bir genel bakış

MFC'ın sarma tarafından işleme ayrıntılarını pek çok küçük şeyler hakkında endişe yok dao kolay kullanarak dao yapar. Bu ole, oluşturulması ve yönetimi dao nesneleri (özellikle koleksiyonu), hata denetleme ve kesinlikle yazılan, basit bir arayüz (hiçbir VARYANT veya bstr değişkenler) sağlayan başlatılması içerir. Doğrudan dao arama yapabilir ve hala bu özelliklerden yararlanabilirsiniz. Tüm kodunuzu yapmanız gerekir çağır Release doğrudan dao çağrıları tarafından oluşturulan tüm nesnelerin ve değil mfc dahili olarak kullanan arabirimi işaretçiler değiştirebilir. Örneğin, tüm iç etkileri anlamanız sürece bir CDaoRecordset nesne m_pDAORecordset üyesi değiştirmeyin. Ancak, doğrudan Fields derlemesini almak için dao aramak için m_pDAORecordset arabirimi kullanabilirsiniz. Bu durumda m_pDAORecordset üye değişiklik değil. Sadece nesneyle bittiğinde yayın alanları koleksiyonu nesne üzerinde aramak zorunda.

Dao yapmak için yardımcılar açıklaması daha kolay arama

Dao daha kolay yapmak için sağlanan yardımcıları mfc dao veritabanı sınıfları dahili olarak kullanılan aynı yardımcıları vardır. Bu yardımcılar, hata ayıklama çıktısı, beklenen hatalara karşı denetleme ve gerekirse uygun özel durumlar Fırlatma günlüğü dönüş kodları doğrudan bir dao arama yaparken denetlemek için kullanılır. İki temel yardımcı işlevlerini ve bu iki yardımcıları birine göster dört makroları vardır. En iyi açıklama sadece kod okumak olacaktır. dao_check, dao_check_error, dao_check_memve dao_trace içinde afxdao bakın.H makrolar ve AfxDaoCheck ve AfxDaoTrace içinde daocore bakın.CPP.

Dao ole arabirimlerini kullanarak

Dao nesne hiyerarşisi içindeki her nesnenin ole arabirimleri DBDAOINT başlık dosyasında tanımlanmıştır.H, \Program Files\DevStudio\VC\include dizininde bulunur. Bu arabirimler tamamı dao hiyerarşisi değiştirmenize olanak sağlayan yöntemleri sağlar.

Birçok dao arabirim yöntemleri, bstr nesne (ole Otomasyon kullanılan uzunluğu önek dizesi) işlemek gerekir. bstr nesne genellikle değişken veri türü içinde kapsüllenir. mfc sınıf COleVariant kendisi, VARIANT veri türü devralır. İster size projenizin ANSI veya UNICODE inşa bağlı, dao arabirimleri ANSI veya UNICODE bstrs döner. İki makrolar, v_bstr ve v_bstrt, dao arabirimi bstr beklenen türü alır temin için yararlı.

v_bstr bir COleVariant bstrVal üyesi ayıklar. Bu makro, genellikle dao arabirimi bir yönteme COleVariant içeriğini aktarmak istediğinizde kullanılır. Aşağıdaki kod bölümü hem beyanlar hem de gerçek kullanım için iki yöntem dao DAOUser arabiriminin v_bstr makro yararlanmak gösterir:

COleVariant varOldName;
COleVariant varNewName (_T("NewUser"), vt_bstrt);

/ / Code pUser ihmal geçerli bir değer atamak için
DAOUser * pUser = null;

/ / Bu yöntem bildirimleri DBDAOINT alınmıştır.H
/ / STDMETHOD(get_Name) (THIS_ bstr far * pbstr) saf;
/ / STDMETHOD(put_Name) (THIS_ bstr bstr) saf;

dao_check (pUser-gt; Stringget_Name (& v_bstr (ve varOldName)));
dao_check (pUser - > put_Name (v_bstr (ve varNewName)))

ANSI sürümü uygulamanız ve Uunicode bstr uygulama Unicode sürümünü oluşturursanız, orada COleVariant Oluşturucu yukarıda belirtilen vt_bstrt bağımsız değişken sağlar Not COleVariant bir ANSI bstr olacaktır. Ne dao beklediği budur.

Diğer makro, v_bstrt, COleVariant yapı (ANSI veya UNICODE) türüne bağlı olarak bir ANSI veya UNICODE bstrVal üyesi ayıklar. Şu kod, bstr değeri bir COleVariant bir CString ayıklamak için gösterir:

COleV&ariant değişken (_t ("MyName"), vt_bstrt);
CString str = v_bstrt (amp; değişken)

Diğer açık çatlamak için diğer hileler ile birlikte v_bstrt makro COleVariantiçinde saklı türler gösterdi Visual c++ CD'sinde DAOVIEW örnek. Özellikle, bu çeviri CCrack::strVARIANT yönteminde gerçekleştirilir. Bu yöntem, mümkün olduğunca, bir COleVariant CString örneğine çevirir.

Dao doğrudan çağrısının basit bir örnek

Alttaki dao koleksiyon nesnelerinin yenilemek gerekli olduğunda durumlar ortaya çıkabilir. Normalde bu gerekli olmamalı, ama basit bir prosedür ise gereklidir. Ne zaman bir koleksiyon yenilenmesi gerekebilir bir çok kullanıcılı bir ortamda yeni TableDef oluşturma birden çok kullanıcıyla çalışırken örnektir. Bu durumda, TableDef derlemesini eski haline gelebilir. Koleksiyonu yenilemek için özel koleksiyon nesnesinin yenileme yöntemini çağırın ve hataları denetlemek yeterlidir:

Dao_check (pMyDaoDatabase-gt;
    m_pDAOTableDefs - > Yenile ())

Şu anda tüm dao koleksiyon nesnesi arabirimleri belgesiz uygulama ayrıntılarını mfc dao veritabanı sınıfları olduğunu unutmayın.

Dao doğrudan dao güvenlik özelliklerini kullanma

Mfc dao veritabanı sınıflarını dao güvenlik özellikleri sarmak değil. Bazı dao güvenlik özelliklerini kullanmak için dao arabirim yöntemleri çağırmalısınız. Aşağıdaki işlevi sistem veritabanı ayarlar ve kullanıcı parolasını değiştirir. Sonradan tanımlanan üç diğer işlevler, bu işlev çağrıları.

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

   .
   .
   .

}

Sonraki dört örnek göstermek nasıl yapılır:

Sistem veritabanı ayarlama

Aşağıda, bir uygulama tarafından kullanılacak veritabanı ayarlamak için örnek işlevi var. Diğer bir dao çağrıları yapılmadan önce bu işlevi çağrılmalıdır.

/ / Sistem veritabanı kümesi / / dao veritabanı motoru kullanacak

void SetSystemDB (CString amp; strSystemMDB)
{
   COleVariant varSystemDB (strSystemMDB, vt_bstrt);

/ / dao mfc için başlatılamıyor
   AfxDaoInit ();
   DAODBEngine * pDBEngine = AfxDaoGetEngine ();

assert (pDBEngine! = null);

/ / Ayarlamak için put_SystemDB yöntemini çağırın / / sistem veritabanı için dao motoru
   dao_check (pDBEngine - > put_SystemDB (varSystemDB.bstrVal));
}

Varsayılan kullanıcı ve parola ayarlama

Varsayılan kullanıcı ve sistem veritabanı parolasını ayarlamak için şu işlevi kullanın.:

void SetDefaultUser (CString amp; 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 varsayılan şifre:
  dao_check (pDBEngine - > put_DefaultPassword (varPassword.bstrVal));
}

Kullanıcı parolasını değiştirme

Kullanıcı parolasını değiştirmek için şu 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->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( );
}

Parolasını değiştirme bir.mdb dosya

Şifresini değiştirmek için bir.mdb dosyası, aşağıdaki işlev kullanma:

void SetDBPassword (lpctstr pDB, lpctstr pszOldPassword, lpctstr pszNewPassword)
{
 nbsp; CDaoDatabase db;
   CString strConnect (_t ("; pwd ="));

/ / Veritabanı özel olarak açılmalıdır
   / / bir parola ayarlamak için
   DB.Açık (pDB, true, false, strConnect + pszOldPassword);

COleVariant YeniParola (pszNewPassword, vt_bstrt),
               EskiParola (pszOldPassword, vt_bstrt);

dao_check (db.m_pDAODatabase - > (v_bstr (& EskiParola), yeniparola
              v_bstr (ve yeniparola)));

DB.Close();
}

Teknik notlar numarasına göre |nbsp; Teknik notlar kategorisine göre

Index