หมายเหตุนี้อธิบายถึงสถาปัตยกรรมเขตข้อมูลบันทึกแลกเปลี่ยน (RFX) มันยังอธิบายถึงวิธีเขียนขั้นตอนการRFX_?
ภาพรวมของการแลกเปลี่ยนเขตข้อมูลของระเบียน
ฟังก์ชันฟิลด์ชุดระเบียนทั้งหมดเสร็จ ด้วยรหัส c ++ มีไม่มีทรัพยากรที่พิเศษหรือแมโครวิเศษ หัวใจของกลไกที่เป็นฟังก์ชันเสมือนที่ต้องถูกลบล้างได้ในทุกชั้นได้รับชุดระเบียน มันจะพบเสมอในแบบฟอร์มนี้:
cMySet::DoFieldExchange (CFieldExchange * pFX) ถือเป็นโมฆะ
{
//{{AFX_FIELD_MAP(CMySet)
lt; recordset แลกเปลี่ยนฟิลด์ชนิดเรียก >
< recordset แลกเปลี่ยนเรียกฟังก์ชัน >
//}}AFX_FIELD_MAP
}
ข้อคิดเห็น AFX รูปแบบพิเศษอนุญาตให้ ClassWizard เพื่อค้นหา และแก้ไขรหัสภายในฟังก์ชันนี้ ควรวางโค้ดที่ไม่เข้ากันกับ ClassWizard ภายนอกของข้อคิดเห็นรูปแบบพิเศษ?
ในตัวอย่างข้างต้น lt; recordset_exchange_field_type_call > อยู่ในแบบฟอร์ม:
pFX-gtSetFieldType(CFieldExchange::outputColumn)(&G)
และ ลาย recordset_exchange_function_call > อยู่ในแบบฟอร์ม:
RFX_Custom (pFX, "Col2", m_Col2)
ฟังก์ชันRFX_ส่วนใหญ่มีสามอาร์กิวเมนต์ดังแสดงข้างต้น แต่บางอย่าง (เช่นRFX_TextและRFX_Binary) มีอาร์กิวเมนต์ที่เป็นตัวเลือกเพิ่มเติม?
มากกว่าหนึ่งRFX_ที่อาจรวมอยู่ในแต่ละฟังก์ชันDoDataExchange?
ดู 'afxdb.h' สำหรับรายการทั้งหมดในชุดระเบียนที่เขตข้อมูลแลกเปลี่ยนชก็มี MFC?
ชุดระเบียนที่เขตข้อมูลสายเป็นวิธีการลงทะเบียนตำแหน่งหน่วยความจำ (โดยปกติข้อมูลสมาชิก) เพื่อจัดเก็บข้อมูลในเขตข้อมูลสำหรับคลาสCMySet?
หมายเหตุ
ชุดระเบียนที่เขตข้อมูลฟังก์ชันถูกออกแบบมาเพื่อทำงานกับคลาสที่CRecordsetเท่านั้น พวกเขาจะไม่สามารถใช้งานได้ โดยเรียน MFC อื่น ๆ โดยทั่วไป?
กำหนดค่าเริ่มต้นของข้อมูลในตัวที่มาตรฐาน c ++สร้าง มักจะอยู่ในบล็อกกับ //{{AFX_FIELD_INIT(CMylSet) และ //}}AFX_FIELD_INIT ข้อคิดเห็น?
แต่ละฟังก์ชันRFX_ต้องรองรับการดำเนินงานต่าง ๆ การตั้งแต่การกลับสถานะสกปรกของฟิลด์เมื่อต้องการเก็บถาวรเตรียมพร้อมสำหรับการแก้ไขเขตข้อมูลเขตข้อมูล?
แต่ละฟังก์ชันที่เรียกDoFieldExchange (เช่นSetFieldNull, IsFieldDirty), ไม่เตรียมใช้งานตัวเองรอบการเรียกไปยังDoFieldExchange?
อย่างไรได้ผล?
คุณไม่จำเป็นต้องทำความเข้าใจต่อไปนี้เพื่อใช้แลกเปลี่ยนเขตข้อมูลของระเบียน อย่างไรก็ตาม ทำความเข้าใจกับวิธีนี้การทำงานเบื้องหลังจะช่วยให้คุณสามารถเขียนกระบวนการแลกเปลี่ยนของคุณเอง?
ฟังก์ชันสมาชิกDoFieldExchangeอยู่มากเช่นฟังก์ชันสมาชิกSerialize - เป็นผู้รับผิดชอบสำหรับการรับ หรือการตั้งค่าข้อมูลไปยัง/จาก/ข้อมูลสมาชิกในชั้นเรียนจากแบบฟอร์มภายนอก (ในคอลัมน์นี้กรณีจากผลลัพธ์ของแบบสอบถามแบบ ODBC) พารามิเตอร์pFXคือบริบทสำหรับทำการแลกเปลี่ยนข้อมูล และคล้ายคลึงกับพารามิเตอร์CArchiveเป็นCObject::Serialize PFX (วัตถุCFieldExchange ) มีตัวชี้การดำเนินงาน ซึ่งคล้ายคลึงกับ แต่ generalization ของทิศทางCArchiveที่ตั้งค่าสถานะ ฟังก์ชัน RFX การอาจมีการสนับสนุนการดำเนินงานต่อไปนี้
นามสกุลของผู้ใช้
มีหลายวิธีในการขยายกลไกที่ RFX เริ่มต้น คุณสามารถ
CBookmark
โมฆะ AFXAPI RFX_Bigint(CFieldExchange* pFX, const char *szName,
nbsp BIGINT & ค่า)
ในขณะที่ (posExtraFields ! = NULL)
{
nbsp RFX_Text (pFX, m_listName.GetNext(posExtraFields), m_listValue.GetNext(posExtraValues))
}(&N)
หมายเหตุnbsp เช่นรหัสไม่สามารถแก้ไขได้ โดย ClassWizard และควรใช้ภายนอกเฉพาะของข้อคิดเห็นรูปแบบพิเศษ(&N)?
เขียนเอง RFX
การเขียนฟังก์ชัน RFX การกำหนดเองของคุณเอง แนะนำให้ คุณคัดลอกฟังก์ชันการ RFX ที่มีอยู่ และทำการปรับเปลี่ยนเพื่อวัตถุประสงค์ในการทำงานของคุณเอง เลือก RFX ขวาเมื่อต้องการคัดลอกสามารถทำให้งานของคุณได้ง่ายขึ้นมาก บางฟังก์ชัน RFX มีคุณสมบัติเฉพาะบางอย่างที่คุณควรคำนึงเมื่อตัดสินใจที่จะคัดลอก?
RFX_Long และ RFX_Int:
เหล่านี้เป็นฟังก์ชัน RFX การที่ง่ายที่สุด ค่าข้อมูลไม่จำเป็นต้องมีการตีความเนื้อความพิเศษ และขนาดของข้อมูลได้รับการแก้ไข?
RFX_Single และ RFX_Double:
เช่น RFX_Long และ RFX_Int ข้างต้น ฟังก์ชันเหล่านี้ได้ง่าย และสามารถทำให้ใช้การเริ่มต้นการใช้งานอย่างกว้างขวาง มีเก็บไว้ใน dbflt.cpp แทนของ dbrfx.cpp อย่างไรก็ตาม เพื่อให้การโหลด runtime ไลบรารีของจุดลอยตัวเมื่อพวกเขาได้อย่างชัดเจนการอ้างอิงเท่านั้น?
RFX_Text และ RFX_Binary:
ฟังก์ชันเหล่านี้สอง preallocate บัฟเฟอร์เพื่อเก็บข้อมูลสายอักขระเป็นเลขฐานสองคง และต้องลงทะเบียนบัฟเฟอร์เหล่านี้กับ ODBC SQLBindCol แทนของการลงทะเบียนแอมป์ ค่า เนื่องจากการนี้ สองฟังก์ชันเหล่านี้มีรหัสตัวพิมพ์พิเศษมากมาย(&A)?
RFX_Date:
ODBC ส่งกลับข้อมูลวันและเวลาในโครงสร้างข้อมูลการ TIMESTAMP_STRUCT ของตนเอง ฟังก์ชันนี้ช่วยจัดสรร TIMESTAMP_STRUCT ที่เป็น "พร็อกซี" เพื่อส่งหรือรับข้อมูลเวลาวัน การดำเนินการต่าง ๆ ต้องถ่ายโอนข้อมูลวันและเวลาระหว่างวัตถุ c ++ CTimeและพร็อกซี TIMESTAMP_STRUCT Needless to say นี้ complicates ฟังก์ชันนี้มาก แต่ก็เป็นตัวอย่างที่ดีของวิธีการใช้พร็อกซีสำหรับการถ่ายโอนข้อมูล?
RFX_LongBinary:
นี่เป็นเพียงคลารี RFX ฟังก์ชันที่ไม่ได้ใช้รวมคอลัมน์เพื่อรับ และส่งข้อมูล ฟังก์ชันนี้ละเว้นการดำเนินการของ BindFieldToColumn และแทน ระหว่างการดำเนินการดำเนินการแก้ไข จัดสรรจัดเก็บเพื่อใช้เก็บข้อมูล SQL_LONGVARCHAR หรือ SQL_LONGVARBINARY ขาเข้า แล้วทำการเรียก SQLGetData ในการเรียกค่าลงในเก็บข้อมูลที่จัดสรรไว้ เมื่อเตรียมที่จะส่งค่าข้อมูลกลับไปยังแหล่งข้อมูล (เช่น NameValue และค่าดำเนินการ), ฟังก์ชันนี้ใช้ฟังก์ชันการทำงานของ ODBC ของ DATA_AT_EXEC ดู45 หมายเหตุทางเทคนิคสำหรับข้อมูลเพิ่มเติมเกี่ยวกับการทำงานกับ SQL_LONGVARBINARY และ SQL_LONGVARCHARs?
เมื่อเขียนฟังก์ชันของคุณเองRFX_คุณมักจะได้การใช้CFieldExchange::Defaultเพื่อใช้การดำเนินการที่กำหนด ดูที่การใช้งานเริ่มต้นสำหรับการดำเนินการในคำถาม ถ้ามันทำการดำเนินการที่คุณจะสามารถเขียนในฟังก์ชันRFX_ของคุณ คุณสามารถมอบหมายไปCFieldExchange::Default. คุณสามารถดูตัวอย่างของการโทรCFieldExchange::Defaultใน dbrfx.cpp
เป็นสิ่งสำคัญในการเรียกIsFieldTypeที่เริ่มต้นของฟังก์ชัน RFX ของคุณ และกลับทันทีถ้า จะส่งกลับ FALSE กลไกนี้ทำให้การดำเนินงานของพารามิเตอร์จากกำลังทำงานบนoutputColumnsและในทางกลับกัน (เช่นเรียกBindParamในการoutputColumn) นอกจากนี้IsFieldTypeโดยอัตโนมัติทำให้ติดตามการนับจำนวนoutputColumns (m_nFields) และ params (m_nParams)?
หมายเหตุด้านเทคนิคตามหมายเลข|nbsp หมายเหตุด้านเทคนิคตามประเภท(&N)