TN043: RFX Rutinleri
Dekont
Aşağıdaki teknik not, çevrimiçi belgelere ilk kez eklendiğinden beri güncelleştirilmemiştir. Sonuç olarak, bazı yordamlar ve konular güncel olmayabilir veya yanlış olabilir. En son bilgiler için, çevrimiçi belge dizininde ilgilendiğiniz konuyu aramanız önerilir.
Bu not, kayıt alanı değişimi (RFX) mimarisini açıklar. Ayrıca bir RFX_ yordamını nasıl yazdığınızı da açıklar.
Kayıt Alanı Değişimine Genel Bakış
Tüm kayıt kümesi alanı işlevleri C++ koduyla gerçekleştirilir. Özel kaynaklar veya sihirli makrolar yoktur. Mekanizmanın kalbi, türetilmiş her kayıt kümesi sınıfında geçersiz kılınması gereken bir sanal işlevdir. Her zaman şu biçimde bulunur:
void CMySet::DoFieldExchange(CFieldExchange* pFX)
{
//{{AFX_FIELD_MAP(CMySet)
<recordset exchange field type call>
<recordset exchange function call>
//}}AFX_FIELD_MAP
}
Özel biçimli AFX açıklamaları ClassWizard'ın bu işlev içindeki kodu bulmasına ve düzenlemesine olanak tanır. ClassWizard ile uyumlu olmayan kod, özel biçim açıklamalarının dışına yerleştirilmelidir.
Yukarıdaki örnekte, <recordset_exchange_field_type_call> formdadır:
pFX->SetFieldType(CFieldExchange::outputColumn);
ve <recordset_exchange_function_call> şu biçimdedir:
RFX_Custom(pFX, "Col2", m_Col2);
Çoğu RFX_ işlevinin yukarıda gösterildiği gibi üç bağımsız değişkeni vardır, ancak bazılarında (örn. RFX_Text
ve RFX_Binary
) ek isteğe bağlı bağımsız değişkenler vardır.
Her DoDataExchange
işleve birden fazla RFX_ eklenebilir.
MFC ile sağlanan tüm kayıt kümesi alanı değişim yordamlarının listesi için bkz. 'afxdb.h'.
Kayıt kümesi alan çağrıları, bir sınıfın alan verilerini depolamak için bellek konumlarını (genellikle veri üyeleri) kaydetmenin bir CMySet
yoludur.
Notlar
Kayıt kümesi alan işlevleri yalnızca sınıflarla CRecordset
çalışacak şekilde tasarlanmıştır. Bunlar genellikle diğer MFC sınıfları tarafından kullanılamaz.
Verilerin ilk değerleri standart C++ oluşturucusunda, genellikle ve //}}AFX_FIELD_INIT
açıklamalarıyla //{{AFX_FIELD_INIT(CMylSet)
bir blokta ayarlanır.
Her RFX_ işlevi, alanın kirli durumunu döndürmeden alanı düzenleme hazırlığında arşivleme işlemine kadar çeşitli işlemleri desteklemelidir.
çağıran DoFieldExchange
her işlev (örneğin SetFieldNull
, IsFieldDirty
) çağrısının çevresinde kendi başlatmasını DoFieldExchange
yapar.
Nasıl Çalışır?
Kayıt alanı değişimini kullanmak için aşağıdakileri anlamanız gerekmez. Ancak, bunun arka planda nasıl çalıştığını anlamak, kendi değişim yordamınızı yazmanıza yardımcı olur.
DoFieldExchange
Üye işlevi, üye işlevine Serialize
çok benzer; bir dış forma /bu örnekte ODBC sorgusunun sonucundan sütunlara) verileri sınıftan/sınıftaki üye verilere almaktan veya ayarlamaktan sorumludur. pFX parametresi, veri değişiminin bağlamıdır ve CArchive parametresine CObject::Serialize
benzer. pFX'in (nesneCFieldExchange
), CArchive yön bayrağının genelleştirilmesine benzer bir işlem göstergesi vardır. RfX işlevinin aşağıdaki işlemleri desteklemesi gerekebilir:
BindParam
— ODBC'nin parametre verilerini nereden alması gerektiğini belirtinBindFieldToColumn
— ODBC'nin outputColumn verilerini alması/yatırması gereken yeri belirtinFixup
— Uzunlukları ayarlaCString/CByteArray
, NULL durum bitini ayarlaMarkForAddNew
— AddNew çağrısından bu yana değer değiştiyse kirli olarak işaretleMarkForUpdate
— Düzenleme çağrısından bu yana değer değiştiyse kirli olarak işaretleName
— Kirli olarak işaretlenmiş alanların alan adlarını eklemeNameValue
— Kirli olarak işaretlenmiş alanlar için "<sütun adı>=" ekleyinValue
— "" öğesini ve ardından ',' veya ' ' gibi ayırıcıyı ekleyinSetFieldDirty
— Durum bit kirli (yani değiştirilmiş) alanı ayarlayınSetFieldNull
— Alan için null değeri gösteren durum biti ayarlamaIsFieldDirty
— Kirli durum bitinin dönüş değeriIsFieldNull
— Null durum bitinin dönüş değeriIsFieldNullable
— Alan NULL değerleri barındırabiliyorsa DOĞRU döndürStoreField
— Arşiv alanı değeriLoadField
— Arşivlenen alan değerini yeniden yüklemeGetFieldInfoValue
— Bir alandaki genel bilgileri döndürmeGetFieldInfoOrdinal
— Bir alandaki genel bilgileri döndürme
Kullanıcı Uzantıları
Varsayılan RFX mekanizmasını genişletmenin çeşitli yolları vardır. Yapabilecekleriniz
Yeni veri türleri ekleyin. Örneğin:
CBookmark
Yeni exchange yordamları (RFX_) ekleyin.
void AFXAPI RFX_Bigint(CFieldExchange* pFX, const char *szName, BIGINT& value);
Üye işlevinin
DoFieldExchange
koşullu olarak ek RFX çağrıları veya diğer geçerli C++ deyimlerini içermesini sağlayın.while (posExtraFields != NULL) { RFX_Text(pFX, m_listName.GetNext(posExtraFields), m_listValue.GetNext(posExtraValues)); }
Dekont
Bu tür kod ClassWizard tarafından düzenlenemez ve yalnızca özel biçim açıklamalarının dışında kullanılmalıdır.
Özel RFX Yazma
Kendi Özel RFX işlevinizi yazmak için mevcut bir RFX işlevini kopyalamanız ve kendi amaçlarınıza göre değiştirmeniz önerilir. Kopyalamak için doğru RFX'i seçmek işinizi çok daha kolay hale getirebilir. Bazı RFX işlevleri, hangisinin kopyalandığına karar verirken dikkate almanız gereken bazı benzersiz özelliklere sahiptir.
RFX_Long
ve RFX_Int
: Bunlar en basit RFX işlevleridir. Veri değerinin özel yoruma ihtiyacı yoktur ve veri boyutu sabittir.
RFX_Single
ve RFX_Double
: Yukarıdaki RFX_Long ve RFX_Int gibi bu işlevler de basittir ve varsayılan uygulamayı kapsamlı bir şekilde kullanabilir. Ancak, çalışma zamanı kayan nokta kitaplığının yalnızca açıkça başvurulduğunda yüklenmesini sağlamak için dbrfx.cpp yerine dbflt.cpp dosyasında depolanırlar.
RFX_Text
ve RFX_Binary
: Bu iki işlev, dize/ikili bilgileri tutmak için statik bir arabelleğin yerini alır ve bu arabellekleri &value kaydetmek yerine ODBC SQLBindCol ile kaydetmelidir. Bu nedenle, bu iki işlev çok sayıda özel durum koduna sahiptir.
RFX_Date
: ODBC, tarih ve saat bilgilerini kendi TIMESTAMP_STRUCT veri yapısında döndürür. Bu işlev, tarih saat verilerini göndermek ve almak için bir TIMESTAMP_STRUCT dinamik olarak "proxy" olarak ayırır. Çeşitli işlemler C++ CTime
nesnesi ile TIMESTAMP_STRUCT ara sunucusu arasında tarih ve saat bilgilerini aktarmalıdır. Bu, bu işlevi önemli ölçüde karmaşıklaştırır, ancak veri aktarımı için ara sunucu kullanmanın iyi bir örneğidir.
RFX_LongBinary
: Bu, veri almak ve göndermek için sütun bağlama kullanmayan tek sınıf kitaplığı RFX işlevidir. Bu işlev BindFieldToColumn işlemini yoksayar ve bunun yerine, Fixup işlemi sırasında gelen SQL_LONGVARCHAR veya SQL_LONGVARBINARY verileri tutmak için depolama ayırır, ardından değeri ayrılan depolama alanına almak için bir SQLGetData çağrısı gerçekleştirir. Veri değerlerini veri kaynağına geri göndermeye hazırlanırken (NameValue ve Value işlemleri gibi), bu işlev ODBC'nin DATA_AT_EXEC işlevselliğini kullanır. SQL_LONGVARBINARY ve SQL_LONGVARCHARs ile çalışma hakkında daha fazla bilgi için bkz . Teknik Not 45 .
Kendi RFX_ işlevinizi yazarken, genellikle belirli bir işlemi uygulamak için kullanabilirsiniz CFieldExchange::Default
. Söz konusu işlem için Default uygulamasına bakın. RFX_ işlevinizde yazmakta olduğunuz işlemi gerçekleştirirse, için CFieldExchange::Default
temsilci atayabilirsiniz. dbrfx.cpp dosyasında çağrı CFieldExchange::Default
örneklerini görebilirsiniz
RFX işlevinizin başında çağrısı IsFieldType
yapmak ve YANLIŞ döndürürse hemen döndürmek önemlidir. Bu mekanizma, parametre işlemlerinin outputColumns üzerinde gerçekleştirilmesini (outputColumn'da çağırma BindParam
gibi) korur. Ayrıca outputColumns IsFieldType
(m_nFields) ve parametreler (m_nParams) sayısını otomatik olarak izler.