Aracılığıyla paylaş


TN053: DAO Veritabanı Sınıfları için Özel DFX Rutinleri

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.

Bu teknik not, DAO kayıt alanı değişimi (DFX) mekanizmasını açıklar. DFX yordamlarında DFX_Text neler olduğunu anlamaya yardımcı olmak için işlev, örnek olarak ayrıntılı olarak açıklanacaktır. Bu teknik nota ek bilgi kaynağı olarak, diğer tek tek DFX işlevlerinin kodunu inceleyebilirsiniz. Büyük olasılıkla özel bir RFX yordamına (ODBC veritabanı sınıflarıyla birlikte kullanılır) ihtiyaç duyabileceğiniz sıklıkta özel bir DFX yordamına ihtiyacınız olmayacaktır.

Bu teknik not şunu içerir:

DFX'e Genel Bakış

DAO kayıt alanı değişim mekanizması (DFX), sınıfını kullanırken veri alma ve güncelleştirme yordamını CDaoRecordset basitleştirmek için kullanılır. Bu işlem, sınıfın CDaoRecordset veri üyeleri kullanılarak basitleştirilir. öğesinden CDaoRecordsettüreterek, bir tablo veya sorgudaki her alanı temsil eden türetilmiş sınıfa veri üyeleri ekleyebilirsiniz. Bu "statik bağlama" mekanizması basittir, ancak tüm uygulamalar için tercih edilecek veri getirme/güncelleştirme yöntemi olmayabilir. DFX, geçerli kayıt her değiştirildiğinde her ilişkili alanı alır. Para birimi değiştirildiğinde her alanın getirilip getirilmemesi gereken performansa duyarlı bir uygulama geliştiriyorsanız ve aracılığıyla CDaoRecordset::GetFieldValueCDaoRecordset::SetFieldValue "dinamik bağlama" tercih ettiğiniz veri erişim yöntemi olabilir.

Dekont

DFX ve dinamik bağlama birbirini dışlamaz, bu nedenle statik ve dinamik bağlamanın karma kullanımı kullanılabilir.

Örnek 1 — Yalnızca DAO Kayıt Alanı Değişimi kullanımı

(varsayılır CDaoRecordset — türetilmiş sınıf CMySet zaten açık)

// Add a new record to the customers table
myset.AddNew();

myset.m_strCustID = _T("MSFT");

myset.m_strCustName = _T("Microsoft");

myset.Update();

Örnek 2 — Yalnızca dinamik bağlama kullanımı

(sınıfını rskullandığını CDaoRecordset ve zaten açık olduğunu varsayar)

// Add a new record to the customers table
COleVariant  varFieldValue1 (_T("MSFT"),
    VT_BSTRT);

//Note: VT_BSTRT flags string type as ANSI,
    instead of UNICODE default
COleVariant  varFieldValue2  (_T("Microsoft"),
    VT_BSTRT);

rs.AddNew();

rs.SetFieldValue(_T("Customer_ID"),
    varFieldValue1);

rs.SetFieldValue(_T("Customer_Name"),
    varFieldValue2);

rs.Update();

Örnek 3 — DAO Kayıt Alanı Değişimi ve dinamik bağlama kullanımı

(türetilmiş sınıf empile CDaoRecordsetçalışan verilerine göz atmayı varsayar)

// Get the employee's data so that it can be displayed
emp.MoveNext();

// If user wants to see employee's photograph,
// fetch it
COleVariant varPhoto;
if (bSeePicture)
    emp.GetFieldValue(_T("photo"),
    varPhoto);

// Display the data
PopUpEmployeeData(emp.m_strFirstName,
    emp.m_strLastName,
    varPhoto);

DFX Nasıl Çalışır?

DFX mekanizması, MFC ODBC sınıfları tarafından kullanılan kayıt alanı değişimi (RFX) mekanizmasına benzer şekilde çalışır. DFX ve RFX ilkeleri aynıdır, ancak çok sayıda iç farklılık vardır. DFX işlevlerinin tasarımı, neredeyse tüm kodların tek tek DFX yordamları tarafından paylaşılmasıydı. En yüksek düzeyde DFX yalnızca birkaç şey yapar.

  • DFX gerekirse SQL SELECT yan tümcesini ve SQL PARAMETERS yan tümcesini oluşturur.

  • DFX, DAO'nun GetRows işlevi tarafından kullanılan bağlama yapısını oluşturur (daha sonra bununla ilgili daha fazla bilgi).

  • DFX, kirli alanları algılamak için kullanılan veri arabelleği yönetir (çift arabelleğe alma kullanılıyorsa)

  • DFX, NULL ve DIRTY durum dizilerini yönetir ve güncelleştirmelerde gerekirse değerleri ayarlar.

DFX mekanizmasının merkezinde türetilmiş sınıfın CDaoRecordset işlevi yer alır DoFieldExchange . Bu işlev, uygun işlem türündeki tek tek DFX işlevlerine çağrılar iletir. İç MFC işlevlerini çağırmadan DoFieldExchange önce işlem türünü ayarlayın. Aşağıdaki listede çeşitli işlem türleri ve kısa bir açıklama gösterilmektedir.

Operation Açıklama
AddToParameterList PARAMETERS yan tümcesi oluşturur
AddToSelectList SELECT yan tümcesini oluşturur
BindField Bağlama yapısını ayarlar
BindParam Parametre değerlerini ayarlar
Fixup NULL durumunu ayarlar
AllocCache Kirli denetim için önbellek ayırır
StoreField Geçerli kaydı önbelleğe kaydeder
LoadField Önbelleği üye değerlerine geri yükler
FreeCache Önbelleği boşaltır
SetFieldNull Alan durumunu ve değerini NULL olarak ayarlar
MarkForAddNew PSEUDO NULL değilse alanları kirli olarak işaretler
MarkForEdit Önbellekle eşleşmiyorsa alanları kirli olarak işaretler
SetDirtyField Kirli olarak işaretlenmiş alan değerlerini ayarlar

Sonraki bölümde, her işlem için DFX_Textdaha ayrıntılı olarak açıklanacaktır.

DAO kayıt alanı değişim işlemi hakkında anlaşılması gereken en önemli özellik, nesnesinin GetRows işlevini CDaoRecordset kullanmasıdır. DAO GetRows işlevi çeşitli yollarla çalışabilir. Bu teknik not, yalnızca bu teknik notun kapsamı dışında olduğu için kısaca açıklanacaktır GetRows . DAO GetRows çeşitli yollarla çalışabilir.

  • Aynı anda birden çok kayıt ve birden çok veri alanı getirebilir. Bu, büyük bir veri yapısıyla ilgilenmenin karmaşıklığı ve her alana ve yapıdaki her veri kaydına uygun uzaklıklar ile daha hızlı veri erişimi sağlar. MFC, bu birden çok kayıt getirme mekanizmasından yararlanmaz.

  • Başka bir yol GetRows , programcıların bir veri kaydı için her alanın alınan verileri için bağlama adresleri belirtmesine izin vermektir.

  • DAO ayrıca çağıranın bellek ayırmasına izin vermek için değişken uzunluklu sütunlar için çağıranı "geri çağırır". Bu ikinci özellik, verilerin kopya sayısını en aza indirmenin yanı sıra verilerin doğrudan bir sınıfın üyelerine (türetilmiş sınıf) depolanmasına izin verme avantajına CDaoRecordset sahiptir. Bu ikinci mekanizma, MFC'nin türetilmiş sınıflardaki CDaoRecordset veri üyelerine bağlanmak için kullandığı yöntemdir.

Özel DFX Yordamınız Ne Yapar?

Bu tartışmada, herhangi bir DFX işlevinde uygulanan en önemli işlemin, öğesini başarıyla çağırmak GetRowsiçin gerekli veri yapılarını ayarlayabilme özelliği olması gerektiği açık. Bir DFX işlevinin de desteklemesi gereken başka işlemler de vardır, ancak hiçbiri çağrıya GetRows doğru hazırlanmak kadar önemli veya karmaşık değildir.

DFX kullanımı çevrimiçi belgelerde açıklanmıştır. Temelde iki gereksinim vardır. İlk olarak, üyeler her ilişkili alan ve parametre için türetilmiş sınıfa eklenmelidir CDaoRecordset . Bunun CDaoRecordset::DoFieldExchange ardından geçersiz kılınmalıdır. Üyenin veri türünün önemli olduğunu unutmayın. Veritabanındaki alandaki veriyle eşleşmeli veya en azından bu türe dönüştürülebilir olmalıdır. Örneğin, veritabanındaki uzun tamsayı gibi sayısal bir alan her zaman metne dönüştürülebilir ve üyeye CString bağlanabilir, ancak veritabanındaki metin alanı, uzun tamsayı gibi sayısal bir gösterime dönüştürülmesi ve uzun bir tamsayı üyesine bağlı olması gerekmeyebilir. DAO ve Microsoft Jet veritabanı altyapısı dönüştürmeden sorumludur (MFC yerine).

DFX_Text ayrıntıları

Daha önce belirtildiği gibi, DFX'in nasıl çalıştığını açıklamanın en iyi yolu bir örnek üzerinden çalışmaktır. Bu amaç için iç içleri DFX_Text üzerinden geçmek, DFX hakkında en azından temel bir anlayış sağlamaya yardımcı olmak için oldukça iyi çalışmalıdır.

  • AddToParameterList

    Bu işlem Jet tarafından gereken SQL PARAMETERS yan tümcesini ("Parameters <param name>, <param type> ... ;") oluşturur. Her parametre adlandırılır ve yazılır (RFX çağrısında belirtildiği gibi). Tek tek türlerin adlarını görmek için işlev CDaoFieldExchange::AppendParamType işlevine bakın. durumundaDFX_Text, kullanılan tür metindir.

  • AddToSelectList

    SQL SELECT yan tümcesini oluşturur. DFX çağrısı tarafından belirtilen sütun adı basitçe eklendiğinden ("SELECT <column name>, ...") bu oldukça basittir.

  • BindField

    İşlemlerin en karmaşıkı. Daha önce belirtildiği gibi, tarafından GetRows kullanılan DAO bağlama yapısının ayarlandığı yer burasıdır. Yapıdaki bilgi türlerindeki DFX_Text koddan görebileceğiniz gibi, kullanılan DAO türünü (DAO_CHAR veya durumunda DFX_TextDAO_WCHAR) içerir. Ayrıca, kullanılan bağlama türü de ayarlanır. Önceki bir bölümde GetRows yalnızca kısa bir süre açıklandı, ancak MFC tarafından kullanılan bağlama türünün her zaman doğrudan adres bağlaması (DAOBINDING_DIRECT) olduğunu açıklamak yeterliydi. MFC'nin bellek ayırmayı denetleyebilmesi ve doğru uzunlukta bir adres belirtebilmesi için değişken uzunlukta sütun bağlamasına (gibi) ek olarak DFX_Textgeri çağırma bağlaması kullanılır. Bunun anlamı, MFC'nin DAO'ya verileri her zaman "nereye" koyacağını söyleyebileceği ve böylece doğrudan üye değişkenlerine bağlanmaya izin verebileceği anlamına gelir. Bağlama yapısının geri kalanı, bellek ayırma geri çağırma işlevinin adresi ve sütun bağlama türü (sütun adına göre bağlama) gibi şeylerle doldurulur.

  • BindParam

    Bu, parametre üyenizde belirtilen parametre değeriyle çağıran SetParamValue basit bir işlemdir.

  • Fixup

    Her alan için NULL durumunu doldurur.

  • SetFieldNull

    Bu işlem yalnızca her alan durumunu NULL olarak işaretler ve üye değişkeninin değerini PSEUDO_NULL olarak ayarlar.

  • SetDirtyField

    Kirli olarak işaretlenmiş her alan için çağrılar SetFieldValue .

Kalan tüm işlemler yalnızca veri önbelleğini kullanmayla ilgilenir. Veri önbelleği, belirli şeyleri daha basit hale getirmek için kullanılan geçerli kayıttaki verilerin ek bir arabelleğidir. Örneğin, "kirli" alanlar otomatik olarak algılanabilir. Çevrimiçi belgelerde açıklandığı gibi, tamamen veya alan düzeyinde kapatılabilir. Arabellek uygulaması bir harita kullanır. Bu eşleme, verilerin dinamik olarak ayrılmış kopyalarını "bağlı" alanın (veya CDaoRecordset türetilmiş veri üyesinin) adresiyle eşleştirmek için kullanılır.

  • AllocCache

    Önbelleğe alınan alan değerini dinamik olarak ayırır ve eşlemeye ekler.

  • FreeCache

    Önbelleğe alınan alan değerini siler ve eşlemeden kaldırır.

  • StoreField

    Geçerli alan değerini veri önbelleğine kopyalar.

  • LoadField

    Önbelleğe alınan değeri alan üyesine kopyalar.

  • MarkForAddNew

    Geçerli alan değerinin NULL olmadığını denetler ve gerekirse kirli olarak işaretler.

  • MarkForEdit

    Geçerli alan değerini veri önbelleğiyle karşılaştırır ve gerekirse kirli işaretler.

Bahşiş

Standart veri türleri için mevcut DFX yordamlarında özel DFX yordamlarınızı modelle.

Ayrıca bkz.

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