Aracılığıyla paylaş


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ı DoFieldExchangeyapar.

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::Serializebenzer. 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 belirtin

  • BindFieldToColumn — ODBC'nin outputColumn verilerini alması/yatırması gereken yeri belirtin

  • Fixup — Uzunlukları ayarla CString/CByteArray , NULL durum bitini ayarla

  • MarkForAddNew — AddNew çağrısından bu yana değer değiştiyse kirli olarak işaretle

  • MarkForUpdate — Düzenleme çağrısından bu yana değer değiştiyse kirli olarak işaretle

  • Name — Kirli olarak işaretlenmiş alanların alan adlarını ekleme

  • NameValue — Kirli olarak işaretlenmiş alanlar için "<sütun adı>=" ekleyin

  • Value — "" öğesini ve ardından ',' veya ' ' gibi ayırıcıyı ekleyin

  • SetFieldDirty — Durum bit kirli (yani değiştirilmiş) alanı ayarlayın

  • SetFieldNull — Alan için null değeri gösteren durum biti ayarlama

  • IsFieldDirty — Kirli durum bitinin dönüş değeri

  • IsFieldNull — Null durum bitinin dönüş değeri

  • IsFieldNullable — Alan NULL değerleri barındırabiliyorsa DOĞRU döndür

  • StoreField — Arşiv alanı değeri

  • LoadField — Arşivlenen alan değerini yeniden yükleme

  • GetFieldInfoValue — Bir alandaki genel bilgileri döndürme

  • GetFieldInfoOrdinal — 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::Defaulttemsilci 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.

Ayrıca bkz.

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