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şimi ve Dinamik Bağlama kullanan örnekler
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 CDaoRecordset
tü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::GetFieldValue
CDaoRecordset::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ı rs
kullandığı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 emp
ile 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_Text
daha 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ıflardakiCDaoRecordset
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 GetRows
iç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şlevCDaoFieldExchange::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ürlerindekiDFX_Text
koddan görebileceğiniz gibi, kullanılan DAO türünü (DAO_CHAR veya durumundaDFX_Text
DAO_WCHAR) içerir. Ayrıca, kullanılan bağlama türü de ayarlanır. Önceki bir bölümdeGetRows
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 olarakDFX_Text
geri ç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.