หมายเหตุนี้อธิบายถึงวิธีการทำธุรกรรมเมื่อใช้คลาสที่ฐานข้อมูล MFC ODBC และโปรแกรมควบคุม Microsoft Access 7.0 ODBC ที่รวมอยู่ใน Microsoft ODBC เดสก์ท็อปไดรเวอร์ Pack รุ่น 3.0?
ภาพรวม
ถ้าโปรแกรมประยุกต์ฐานข้อมูลของคุณทำธุรกรรม คุณต้องระวังการโทรCDatabase::BeginTransและCRecordset::Openในลำดับที่ถูกต้องในโปรแกรมประยุกต์ของคุณ Microsoft Jet database engine ใช้โปรแกรมควบคุม Microsoft Access 7.0 และ Jet ต้องการให้โปรแกรมประยุกต์ของคุณไม่เริ่มทรานแซคชันบนฐานข้อมูลใด ๆ ที่มีเคอร์เซอร์เปิด สำหรับชั้นฐานข้อมูล MFC ODBC เคอร์เซอร์เปิดเป็นการเปิดวัตถุCRecordset?
ถ้าคุณเปิดชุดระเบียนก่อนที่จะเรียกBeginTransคุณอาจไม่เห็นข้อความแสดงข้อผิดพลาดใด ๆ อย่างไรก็ตาม ปรับปรุงชุดระเบียนใด ๆ ทำให้โปรแกรมประยุกต์ของคุณกลายเป็นการถาวรหลังจากโทรCRecordset::Updateและโปรแกรมปรับปรุงจะไม่สามารถยกเลิก โดยการเรียกย้อนกลับ เพื่อหลีกเลี่ยงปัญหานี้ คุณต้องเรียกBeginTransครั้งแรก และจากนั้น เปิดชุดระเบียน?
MFC ตรวจสอบการทำงานของโปรแกรมควบคุมสำหรับเคอร์เซอร์ส่งและเรียกคืนการทำงาน คลาCDatabaseให้สองสมาชิกฟังก์ชันGetCursorCommitBehaviorและGetCursorRollbackBehaviorการตรวจสอบผลของธุรกรรมต่าง ๆ บนวัตถุCRecordsetของคุณเปิด สำหรับโปรแกรมควบคุม ODBC ของ Microsoft Access 7.0 ฟังก์ชันเหล่านี้สมาชิกกลับSQL_CB_CLOSEเนื่องจากโปรแกรมควบคุม Access สนับสนุนการอนุรักษ์เคอร์เซอร์ ดังนั้น คุณต้องโทรCRecordset::Requeryต่อการดำเนินการของCommitTransหรือย้อนกลับ?
เมื่อคุณต้องการทำธุรกรรมต่าง ๆ หลังจากที่อื่น คุณไม่สามารถโทรติดต่อสอบถามใหม่อีกหลังจากธุรกรรมการแรก และจากนั้น เริ่มต้นถัด คุณต้องปิดชุดระเบียนก่อนที่จะสายถัดไปBeginTransเพื่อตอบสนองความต้องการของ Jet หมายเหตุทางเทคนิคนี้อธิบายวิธีที่สองของการจัดการสถานการณ์นี้:
ปิดชุดระเบียนหลังจากแต่ละ CommitTrans หรือดำเนินการย้อนกลับ
ก่อนที่จะเริ่มทรานแซคชัน ทำให้แน่ใจว่า วัตถุชุดระเบียนถูกปิด หลังจากโทรBeginTransเรียกใช้ฟังก์ชันการสมาชิกเปิดของชุดระเบียน ปิดชุดระเบียนหลังจากเรียกCommitTransหรือย้อนกลับทันที หมายเหตุว่า เปิด และปิดชุดระเบียนสามารถลดประสิทธิภาพการทำงานของโปรแกรมประยุกต์?
การใช้ SQLFreeStmt
นอกจากนี้คุณยังสามารถใช้ฟังก์ชัน ODBC API SQLFreeStmtปิดเคอร์เซอร์อย่างชัดเจนหลังจากการสิ้นสุดทรานแซคชัน การเริ่มต้นทรานแซคชันอื่น เรียกBeginTransตามด้วยCRecordset::Requery เมื่อเรียกSQLFreeStmtคุณต้องระบุ HSTMT ของชุดระเบียนเป็นพารามิเตอร์ตัวแรกและSQL_CLOSEเป็นพารามิเตอร์ตัวสอง วิธีการนี้จะเร็วกว่าการปิด และเปิดชุดระเบียนที่เริ่มต้นของแต่ละธุรกรรม รหัสต่อไปนี้สาธิตวิธีการใช้เทคนิคนี้
CMyDatabase db
dbเปิด ("MYDATASOURCE");
อาร์เอส CMyRecordset (แอมป์ db);
/ / เริ่มธุรกรรม 1 และ / / เปิดชุดระเบียน
dbBeginTrans ()
อาร์เอสเปิด()
/ / จัดการข้อมูล
/ / จบธุรกรรม 1
dbCommitTrans () / / หรือย้อนกลับ()
/ / ปิดเคอร์เซอร์
:: SQLFreeStmt (rs.m_hstmt, SQL_CLOSE);
/ / เริ่มธุรกรรม 2
dbBeginTrans ()
/ / ตอนนี้ รับชุดผลลัพธ์
อาร์เอสการสอบถามใหม่อีก();
/ / จัดการข้อมูล
/ / จบธุรกรรม 2
dbCommitTrans ()
อาร์เอสปิด()
db(ปิด)(&A)
อีกวิธีการใช้เทคนิคนี้คือการ เขียนฟังก์ชันใหม่RequeryWithBeginTransซึ่งคุณสามารถเรียกได้เริ่มต้นธุรกรรมหลังจากที่คุณยอมรับหรือเรียกคืนแรกถัดไป เมื่อต้องการเขียนเช่นฟังก์ชัน ทำขั้นตอนต่อไปนี้:
m_pDatabase-gt;BeginTrans(& );ขณะนี้ คุณสามารถเรียกใช้ฟังก์ชันนี้ระหว่างแต่ละคู่ของธุรกรรม:
/ / เริ่มธุรกรรม 1 และ / / เปิดชุดระเบียน
dbBeginTrans ()
อาร์เอสเปิด()
/ / จัดการข้อมูล
/ / จบธุรกรรม 1
dbCommitTrans () nbsp / / หรือย้อนกลับ()
/ / ปิดเคอร์เซอร์ เริ่มต้นธุรกรรมใหม่
/ / และรับชุดผลลัพธ์
อาร์เอสRequeryWithBeginTrans ()
/ / จัดการข้อมูล
/ / จบธุรกรรม 2
dbCommitTrans () / / หรือย้อนกลับ()(&N)
หมายเหตุnbsp ใช้เทคนิคนี้ถ้าคุณต้องการเปลี่ยนชุดระเบียนสมาชิกตัวแปรm_strFilterหรือm_strSortระหว่างธุรกรรม ในกรณีนี้ คุณควรปิดชุดระเบียนหลังจากที่การดำเนินการแต่ละCommitTransหรือย้อนกลับ(&N)?
หมายเหตุด้านเทคนิคตามหมายเลข|nbsp หมายเหตุด้านเทคนิคตามประเภท(&N)