TN053: งานประจำ dfx ไม่ถูกต้องแบบกำหนดเองสำหรับชั้นฐานข้อมูล DAO

หมายเหตุทางเทคนิคนี้อธิบายกลไกการแลกเปลี่ยน (dfx ไม่ถูกต้อง) เขตข้อมูลบันทึกของ DAO เพื่อช่วยในการทำความเข้าใจกับสิ่งที่เกิดขึ้นในงานประจำ dfx ไม่ถูกต้อง ฟังก์ชันDFX_Textจะถูกอธิบายในรายละเอียดเป็นตัวอย่าง เป็นแหล่งเพิ่มเติมของข้อมูลที่จะหมายเหตุนี้ทางด้านเทคนิค คุณสามารถเพียงตรวจรหัสสำหรับอีกฟังก์ชัน dfx ไม่ถูกต้องแต่ละคุณคงไม่ต้องรูทีน dfx ไม่ถูกต้องแบบกำหนดเองบ่อยครั้งเท่าที่คุณอาจจำเป็นรูทีน RFX แบบกำหนดเอง (ใช้กับชั้นฐานข้อมูล ODBC)?

หมายเหตุทางเทคนิคนี้ประกอบด้วย:

ภาพรวม dfx ไม่ถูกต้อง

กลไกการแลกเปลี่ยนการบันทึกเขตข้อมูล DAO (dfx ไม่ถูกต้อง) ใช้ในการลดความซับซ้อนของกระบวนการของการเรียก และปรับปรุงข้อมูลเมื่อมีการใช้คลาCDaoRecordset ขั้นตอนก็ง่ายโดยใช้การข้อมูลสมาชิกของคลาสCDaoRecordset โดยการอนุพันธ์จากCDaoRecordsetคุณสามารถเพิ่มข้อมูลสมาชิกชั้นได้รับการแสดงแต่ละเขตข้อมูลในตารางหรือแบบสอบถาม กลไกนี้ "คงผูก" คือวิ แต่ไม่อาจมีข้อมูลมาใช้โปรแกรมปรับปรุงวิธีการเลือกสำหรับโปรแกรมประยุกต์ทั้งหมด Dfx ไม่ถูกต้องดึงทุกเขตข้อมูลที่ถูกผูกไว้ในแต่ละครั้งที่มีการเปลี่ยนแปลงระเบียนปัจจุบัน ถ้าคุณมีการพัฒนาโปรแกรมประยุกต์มีความสำคัญกับประสิทธิภาพการทำงานที่ไม่ต้องใช้กำลังนำทุกเขตข้อมูลเมื่อมีการเปลี่ยนแปลงสกุลเงิน "dynamic ผูก" ผ่านทางCDaoRecordset::GetFieldValueและCDaoRecordset::SetFieldValueอาจมีวิธีการเลือกการเข้าถึงข้อมูล?

หมายเหตุnbsp  Dfx ไม่ถูกต้องและการผูกข้อมูลแบบไดนามิกไม่เอกลักษณ์ เพื่อใช้ไฮบริการผูกข้อมูลแบบ static และแบบไดนามิกสามารถใช้(&N)?

ตัวอย่าง 1 - ใช้ DAO บันทึกเขตข้อมูล Exchange เท่านั้น

( CDaoRecordset - ชั้นที่ได้รับการสันนิษฐาน CMySet เรียบร้อยแล้วเปิด)

/ / เพิ่มระเบียนใหม่ลงในตารางลูกค้า
mysetAddNew()
myset.m_strCustID = _T("MSFT")
myset.m_strCustName = _T("Microsoft")
mysetUpdate()

ตัวอย่าง 2 - ใช้แบบไดนามิกผูกเท่านั้น

(สมมติโดยใช้คลาสCDaoRecordset , rs และถูกเปิดอยู่)

/ / เพิ่มระเบียนใหม่ลงในตารางลูกค้า
COleVariantnbsp varFieldValue1 (_T("MSFT"), VT_BSTRT);
/ / หมายเหตุ: VT_BSTRT ในสายอักขระชนิดเป็น ANSI แทนที่เป็นของการเริ่มต้นของ UNICODE
COleVariant varFieldValue2 (_T("Microsoft"), VT_BSTRT);
อาร์เอสAddNew()
อาร์เอสSetFieldValue(_T("Customer_ID"), varFieldValue1);
อาร์เอสSetFieldValue(_T("Customer_Name"), varFieldValue2);
อาร์เอสUpdate()(&N)

ตัวอย่าง 3 - ใช้แลกเปลี่ยนเขตข้อมูลของระเบียน DAO และการผูกข้อมูลแบบไดนามิก

(สมมติเรียกดูพนักงานข้อมูลด้วยCDaoRecordset-มาคลา emp )

/ / รับข้อมูลของพนักงานเพื่อให้มันสามารถแสดง
หลังMoveNext()

/ / ถ้าผู้ใช้ต้องการดูภาพถ่ายของพนักงาน
/ / ดึงมัน
COleVariant varPhoto
ถ้า (bSeePicture)
หลังGetFieldValue(_T("photo"), varPhoto);

/ / แสดงข้อมูล
PopUpEmployeeData (emp.m_strFirstName
 emp.m_strLastName, varPhoto)

วิธีการทำงานของ dfx ไม่ถูกต้อง

กลไก dfx ไม่ถูกต้องในการทำงานทำงานคล้ายกับกลไกการแลกเปลี่ยน (RFX) เขตข้อมูลบันทึกการใช้ โดยคลาสที่ MFC ODBC Priciples dfx ไม่ถูกต้องและ RFX จะเหมือนกัน แต่มีความแตกต่างภายในมากมาย การออกแบบของฟังก์ชัน dfx ไม่ถูกต้องได้เช่นว่ารหัสทุกใช้ร่วมกัน โดยงานประจำ dfx ไม่ถูกต้องในแต่ละ ที่ dfx ไม่ถูกสูงระดับต้องเท่านั้นไม่เป็นสิ่งที่?

หัวใจของ dfx ไม่ถูกต้องการ กลไกคือ ฟังก์ชันDoFieldExchangeของคลาCDaoRecordsetมา ฟังก์ชันนี้ dispatches ไปยังฟังก์ชัน dfx ไม่ถูกต้องแต่ละชนิดที่มีการดำเนินการที่เหมาะสม ก่อนที่จะเรียกDoFieldExchange MFC ภายใน ฟังก์ชันตั้งค่าชนิดการดำเนินการ รายการต่อไปนี้แสดงชนิดการดำเนินการต่าง ๆ และคำอธิบายโดยย่อ?

การดำเนินการ คำอธิบาย
AddToParameterList สร้างอนุประโยคของพารามิเตอร์
AddToSelectList สร้างคำสั่ง select
BindField ตั้งค่าการรวมโครงสร้าง
BindParam ตั้งค่าพารามิเตอร์
ดำเนินการแก้ไข ตั้งค่าสถานะเป็น NULL
AllocCache การจัดสรรแคชสำหรับการตรวจสอบที่สกปรก
StoreField บันทึกระเบียนปัจจุบันการแคช
LoadField คืนค่าแคค่าสมาชิก
FreeCache ทำให้แคช
SetFieldNull ชุดเขตข้อมูลสถานะแอมป์ ค่าให้เป็น NULL(&A)
MarkForAddNew ทำเครื่องหมายฟิลด์สกปรกถ้าไม่เทียมระบบ NULL
MarkForEdit ถ้าสกปรกของเครื่องหมายเขตข้อมูลไม่ตรงกับแคช
SetDirtyField ตั้งค่าเขตข้อมูลค่าที่ถูกทำเครื่องหมายว่าสกปรก

ในส่วนถัดไป แต่ละการดำเนินการจะถูกอธิบายในรายละเอียดเพิ่มเติมสำหรับDFX_Text?

คุณลักษณะสำคัญที่สุดเพื่อทำความเข้าใจเกี่ยวกับกระบวนการแลกเปลี่ยนเขตข้อมูลบันทึกของดาวคือ ใช้ฟังก์ชันGetRowsของวัตถุICDaoRecordset ฟังก์ชัน DAO GetRowsสามารถทำงานในหลายวิธี หมายเหตุทางเทคนิคนี้จะเพียงสั้น ๆ อธิบายGetRowsขณะที่มันอยู่นอกเหนือขอบเขตของหมายเหตุทางเทคนิคนี้?

DAO GetRowsสามารถทำงานได้หลายวิธี?

รูทีน dfx ไม่ถูกต้องของคุณเองไม่

มันแจ่มแจ้งจากการสนทนานี้ซึ่งการดำเนินการที่สำคัญที่สุดที่ถูกนำมาใช้ในฟังก์ชันใด ๆ dfx ไม่ถูกต้องต้องเป็นความสามารถในการตั้งค่าโครงสร้างข้อมูลที่จำเป็นให้เรียบร้อยแล้วโทรGetRows มีหมายเลขของการดำเนินการอื่นที่ต้องสนับสนุนฟังก์ชัน dfx ไม่ถูกต้องเช่นกัน แต่ไม่เป็นสิ่งสำคัญและซับซ้อนเป็นอย่างถูกต้องการเตรียมสำหรับการGetRowsไม่ได้เรียก?

การใช้ dfx ไม่ถูกต้องมีการอธิบายไว้ในเอกสารออนไลน์ เลินเล่อ มีความต้องการ 2 ครั้งแรก สมาชิกต้องเพิ่มคลาCDaoRecordsetมาสำหรับแต่ละเขตข้อมูลที่ถูกผูกไว้และพารามิเตอร์ ต่อไปนี้CDaoRecordset::DoFieldExchangeควรถูกเขียนทับ หมายเหตุว่า ชนิดข้อมูลของสมาชิกมีความสำคัญ มันควรตรงกับข้อมูลจากเขตข้อมูลในฐานข้อมูล หรืออย่างน้อย เป็น convertable ชนิด ตัวอย่างเช่นเขตข้อมูลตัวเลขในฐานข้อมูล เช่นจำนวนเต็มแบบยาว เสมอสามารถแปลงเป็นข้อความ และการผูกไว้กับสมาชิกCStringแต่ข้อความเขตข้อมูลในฐานข้อมูลอาจไม่จำเป็นต้องถูกแปลงเป็นรูปตัวเลขแทน เช่นจำนวนเต็มแบบยาว และผูกไว้กับสมาชิกจำนวนเต็มยาว DAO และ Microsoft Jet database engine จะรับผิดชอบสำหรับการแปลง (แทน MFC)?

รายละเอียดของ DFX_Text

ตามที่กล่าวถึงก่อนหน้านี้ คงวิธีดีที่สุดเพื่ออธิบายวิธีการทำงานของ dfx ไม่ถูกต้องคือการ ทำงานเพียงแค่ผ่านตัวอย่าง สำหรับวัตถุประสงค์นี้ ผ่านการ internals ของDFX_Textควรทำงานค่อนข้างดีเพื่อช่วยให้เข้าใจพื้นฐานอย่างน้อย dfx ไม่ถูกต้อง?

AddToParameterList

การดำเนินการนี้สร้างส่วนคำสั่ง SQLพารามิเตอร์(" Parameters lt;param name>, <param type> ... ; ") ตาม Jet แต่ละพารามิเตอร์คือชื่อ และพิมพ์ (ตามที่ระบุไว้ในการเรียก RFX) ดูฟังก์ชันฟังก์ชันCDaoFieldExchange::AppendParamTypeเพื่อดูชื่อของแต่ละชนิด ในกรณีของDFX_Textชนิดที่ใช้เป็นtext?

AddToSelectList

สร้างส่วนคำสั่ง SQL ที่เลือก นี้สวยตรงหน้าเป็นชื่อของคอลัมน์ที่ระบุ โดยการเรียก dfx ไม่ถูกต้องเพียงต่อท้าย (" SELECT lt;column name>, ... ")?

BindField

-ทีเดียวที่ซับซ้อนของการดำเนินงาน ตามที่กล่าวถึงก่อนหน้านี้ซึ่งโครงสร้างรวมดาวที่ใช้โดยGetRowsถูกตั้งค่าเป็น ในขณะที่คุณสามารถดูได้จากรหัสในDFX_Textชนิดของข้อมูลที่อยู่ในโครงสร้างรวมดาวชนิดที่ใช้ (DAO_CHARหรือDAO_WCHARในกรณีของDFX_Text) นอกจากนี้ ชนิดของการรวมที่ใช้อยู่ยังตั้ง ในส่วนก่อนหน้านี้GetRowsถูกอธิบายสั้น ๆ เท่านั้น แต่ก็พอที่จะอธิบายว่า ชนิดของการรวมที่ใช้ โดย MFC มักผูกที่อยู่โดยตรง (DAOBINDING_DIRECT) นอกจากนี้ สำหรับการรวมคอลัมน์ความยาวของตัวแปร (เช่นDFX_Text) กลับผูกถูกใช้เพื่อให้สามารถควบคุมการจัดสรรหน่วยความจำ และระบุที่อยู่ของความยาวที่ถูกต้อง MFC สิ่งนี้หมายความว่า เป็น MFC ที่สามารถเสมอบอก DAO "ที่" เพื่อใส่ข้อมูล การอนุญาตให้รวมเข้ากับตัวแปรของสมาชิกโดยตรงดังนั้น ส่วนเหลือของโครงสร้างรวมถูกกรอกข้อมูล ด้วยสิ่งต่าง ๆ เช่นอยู่ของฟังก์ชันการปันส่วนการเรียกกลับของหน่วยความจำและชนิดของการรวมคอลัมน์ (ผูก โดยชื่อคอลัมน์)?

BindParam

นี้เป็นการดำเนินการอย่างง่ายซึ่งเรียกSetParamValueด้วยค่าพารามิเตอร์ที่ระบุในสมาชิกพารามิเตอร์ของคุณ?

ดำเนินการแก้ไข

กรอกข้อมูลในสถานะว่างสำหรับแต่ละเขตข้อมูล?

SetFieldNull

การดำเนินการนี้สถานะแต่ละเขตข้อมูลเป็นค่า NULLทำเครื่องหมาย และตั้งค่าของตัวแปรสมาชิกเป็นPSEUDO_NULLเท่านั้น?

SetDirtyField

ทำเครื่องหมายในการเรียกSetFieldValueสำหรับแต่ละเขตข้อมูลสกปรก?

การดำเนินงานส่วนที่เหลือทั้งหมดจัดการ ด้วยการใช้แคชข้อมูล แคมีบัฟเฟอร์การเพิ่มข้อมูลในระเบียนปัจจุบันที่ใช้ในการทำบางสิ่งที่ง่ายกว่า ตัวอย่างเช่น เขตข้อมูล "สกปรก" จะสามารถตรวจโดยอัตโนมัติจับ ตามที่อธิบายไว้ในเอกสารประกอบออนไลน์ก็สามารถปิดการใช้งานสมบูรณ์ หรือที่ระดับเขตข้อมูล การใช้งานของบัฟเฟอร์ใช้แผนที่ แผนที่นี้ใช้ให้ตรงกับค่าจัดสรรแบบไดนามิกสำเนาของข้อมูลที่มีอยู่ในเขตข้อมูล "ขอบ" (หรือCDaoRecordset derieved ข้อมูลสมาชิก)?

AllocCache

การจัดสรรค่าเขตข้อมูลที่เก็บในแค และเพิ่มการแมปแบบไดนามิก?

FreeCache

ลบค่าของฟิลด์แคช และออกจากแผนที่?

StoreField

การคัดลอกค่าของฟิลด์ปัจจุบันลงในแค?

LoadField

การคัดลอกค่าเก็บในแคลงในเขตข้อมูลสมาชิก?

MarkForAddNew

ตรวจสอบว่าค่าในเขตข้อมูลปัจจุบันไม่ใช่-NULLและเครื่องหมายที่สกปรกถ้าจำเป็น?

MarkForEdit

เปรียบเทียบค่าปัจจุบันของฟิลด์ ด้วยแค และทำเครื่องหมายที่สกปรกถ้าจำเป็น?

เคล็ดลับnbsp  รุ่นของคุณตามปกติ dfx ไม่ถูกต้องที่กำหนดเองในงานประจำ dfx ไม่ถูกต้องที่มีอยู่สำหรับชนิดข้อมูลมาตรฐาน(&N)?

หมายเหตุด้านเทคนิคตามหมายเลข|nbsp หมายเหตุด้านเทคนิคตามประเภท(&N)

Index