Aracılığıyla paylaş


TN043: rfx yordamları

[!NOT]

İlk çevrimiçi belgelerinde yer almıştır beri aşağıdaki teknik Not güncelleştirilmedi.Sonuç olarak bazı yordamlar ve konuları eski veya yanlış.En son bilgiler için çevrimiçi belgelere dizini ilgilendiğiniz konu aramak önerilir.

Not Bu kayıt alanını exchange (rfx) mimarisini açıklar.Ayrıca yazma biçimini tanımlayan bir rfx_ yordam.

Kayıt alanı Exchange genel bakış

Tüm recordset alanı işlevleri C++ kodu ile yapılır.Özel kaynaklar ya da Sihirli makroları vardır.Kalp mekanizması her recordset türetilmiş sınıfta geçersiz sanal bir işlevdir.Ayrıca, bu formda her zaman bulunur:

void CMySet::DoFieldExchange(CFieldExchange* pFX)
{
  //{{AFX_FIELD_MAP(CMySet)
  <recordset exchange field type call>
  <recordset exchange function call>
  //}}AFX_FIELD_MAP
}

Özel biçim afx yorumlar içinde bu işlev kodu bulup ClassWizard izin verir.Özel biçim yorumlar dışında ClassWizard ile uyumlu olmayan kod yerleştirilmelidir.

Yukarıdaki örnekte, <recordset_exchange_field_type_call> biçimindedir:

pFX->SetFieldType(CFieldExchange::outputColumn);

ve <recordset_exchange_function_call> biçimindedir:

RFX_Custom(pFX, "Col2", m_Col2);

Çoğu rfx_ işlevleri yukarıda gösterildiği gibi üç bağımsız değişkeni, ancak bazı (örn: varRFX_Textve RFX_Binary) ek isteğe bağlı bağımsız değişkenler vardır.

Birden fazla rfx_ dahil her DoDataExchange işlevi.

'Afxdb.h' mfc ile sağlanan tüm recordset alanı exchange yordamların listesi için bkz.

Recordset alanı çağrı alan verilerini depolamak için bellek konumlarını (genellikle veri üyeleri) kaydetme bir yolu olan bir CMySet sınıfı.

Notlar

Recordset alanı işlevleri yalnızca çalışmak için tasarlanmış CRecordset sınıfları.Bunlar genellikle diğer mfc sınıfları tarafından kullanılabilir değil.

İlk değerleri veri kümesi Standart C++ Kurucuda, genellikle bir blok içinde //{{AFX_FIELD_INIT(CMylSet) ve //}}AFX_FIELD_INIT yorumlar.

Her rfx_ işlevi hazırlık alanı düzenlemek için alan arşivleme için alan kirli durumunu döndüren uzanan çeşitli işlemler desteklemesi gerekir.

Her işlevi çağıran DoFieldExchange (örneğin SetFieldNull, IsFieldDirty), kendi başlatma çağrısı etrafında mu DoFieldExchange.

Nasıl çalışır?

Aşağıdaki kayıt alanını exchange kullanmak için anlamanız gerekmez.Ancak, bunun arka planda çalışmasını sağlayacak anlama kendi exchange yordam yazma.

DoFieldExchange Üye işlev çok benzer, Serialize üye işlev — alma veya veri, / / sınıf üyesi verilerde ayarı formundan bir dış (odbc sorgusu sonucu büyük bu sütunlardan) sorumludur.pFX Parametresi veri değişimi yapmak için içeriği ve benzer CArchive parametresi CObject::Serialize.pFX (Bir CFieldExchange nesne) bir işlem göstergesi benzer, ancak genelleştirmesi, CArchive yön bayrağı.rfx işlevi aşağıdaki işlemleri desteklemesi gerekebilir:

  • BindParam — gösterin burada odbc parametre Veri Al

  • BindFieldToColumn — burada odbc gerekir almak/havale outputColumn verileri gösterin

  • Düzeltme — Set CString/CByteArray null durumu bit uzunlukları, ayarlama

  • MarkForAddNew — işareti kirli AddNew çağrı değeri değişmişse

  • MarkForUpdate — değeri Düzenle çağrısından değiştirilmişse işareti kirli

  • Adı — kirli olarak işaretlenmiş alanlar için alan adlarını Ekle

  • NameValue — ekleme "< sütun adı > =?" kirli olarak işaretlenmiş alanlar için

  • Değeri — ekleme "?" ister ayırıcı tarafından izlenen ',' veya ' '

  • SetFieldDirty— Durum kirli (yani bitiDeğiştirilen) alan

  • SetFieldNull— Alanın null değerini gösteren durum biti

  • IsFieldDirty— Kirli durumu bit dönüş değeri

  • IsFieldNull— Dönüş değeri null durumu bit

  • IsFieldNullable— Return true if alanı null değerleri içerebilir

  • StoreField — arşiv alanı değeri

  • LoadField — yeniden arşivlenmiş alan değeri

  • GetFieldInfoValue — alanında bulunan genel bilgileri döndürür

  • GetFieldInfoOrdinal — alanında bulunan genel bilgileri döndürür

Kullanıcı Uzantıları

Varsayılan rfx mekanizması genişletmek için çeşitli yolları vardır.Şunları yapabilirsiniz

  • Yeni veri türlerini ekleyin.Örne?in:

    CBookmark
    
  • Yeni exchange yordamları (rfx_???) ekleyin.

    void AFXAPI RFX_Bigint(CFieldExchange* pFX, const char *szName,
        BIGINT& value);
    
  • Sahip DoFieldExchange üye işlev koşullu ek rfx aramaları veya diğer herhangi bir geçerli C++ ifadeleri içerir.

    while (posExtraFields != NULL)
    {
        RFX_Text(pFX, m_listName.GetNext(posExtraFields), 
            m_listValue.GetNext(posExtraValues));
    }
    

[!NOT]

Bu tür kod ClassWizard tarafından düzenlenen ve yalnızca özel biçim yorumlar dışında kullanılmalıdır.

Özel rfx yazma

Kendi özel rfx işlevi yazmak için varolan bir rfx işlevini kopyalayıp kendi amaçlarına değiştirebilirsiniz önerilir.Seçerek kopyalamak için sağ rfx işinizi çok daha kolay yapabilirsiniz.Bazı rfx işlevleri kopyalama verirken hesaba katmanız bazı benzersiz özellikleri vardır.

  • RFX_Long ve RFX_Int:
    Bunlar Basit rfx işlevlerdir.Veri değeri, özel bir yorumunu gerekmez ve veri boyutu sabittir.

  • RFX_Single ve RFX_Double:
    Bu işlevler RFX_Long ve RFX_Int yukarıdaki gibi basit ve yapabilirsiniz varsayılan uygulanması bolca kullanırlar.Bunlar dbflt.cpp yerine dbrfx.cpp, ancak yükleme noktası kitaplığı yalnızca açıkça referans olduklarında kayan çalışma zamanı'nı etkinleştirmek için saklanır.

  • RFX_Text ve RFX_Binary:
    Bu iki işlev dize/ikili bilgileri tutmak için statik bir arabellek oluşturulacağından ve kaydetme & değer yerine bu arabellekleri odbc SQLBindCol ile kaydetmeniz gerekir.Bu nedenle, çok sayıda özel durum kodu bu iki işlevi vardır.

  • RFX_Date:
    odbc, kendi TIMESTAMP_STRUCT veri yapısı ' tarih ve saat bilgilerini döndürür.Bu işlevi dinamik olarak bir TIMESTAMP_STRUCT "proxy" tarih saat veri gönderip almak için ayırır.Çeşitli işlemler arasında C++ tarih ve saat bilgilerini transfer CTime nesnesi ve TIMESTAMP_STRUCT proxy.Bu önemli ölçüde bu işlevi karmaşıklaştırır ama nasıl veri aktarımı için bir proxy sunucu kullanmak için iyi bir örnek olur.

  • RFX_LongBinary:
    Yalnızca sınıf kitaplığı veri gönderip almak için sütun bağlama kullanmaz rfx işlevi budur.Bu işlev BindFieldToColumn işlem yoksayar ve bunun yerine düzeltme işlemi sırasında sql_longvarchar veya SQL_LONGVARBINARY gelen verileri tutacak depolama ayırır ve ayrılmış depoya değerini almak için bir SQLGetData çağrısı yapar.Veri değerlerini (gibi işlemleri NameValue ve değer) veri kaynağına geri göndermek hazırlanırken, bu işlev ODBC'ın data_at_exec işlevini kullanır.Bakın Teknik Not 45 SQL_LONGVARBINARY ve SQL_LONGVARCHARs ile çalışma hakkında daha fazla bilgi için.

Kendi yazarken rfx_ işlevi, genellikle gereken kullanabilmek için CFieldExchange::Default belirli bir işlemi uygulamak için.Varsayılan uygulama operasyon için bakabilirsiniz.İşlem gerçekleştirirse, yazma, rfx_ işlev için temsilci CFieldExchange::Default. Arama örnekleri görebilirsiniz CFieldExchange::Default dbrfx.cpp,

Çağrı önemlidir IsFieldType rfx işlevi ve hemen false döndürürse return başında.Bu mekanizma üzerinde gerçekleştirilen gelen parametre işlemleri izler outputColumns, veya tam tersi (arama gibi BindParam , bir outputColumn).Buna ek olarak, IsFieldType otomatik olarak sayısını izler outputColumns (m_nFields) ve params (m_nParams).

Ayrıca bkz.

Diğer Kaynaklar

Teknik notlar numarasına göre

Kategoriye göre teknik notlar