TN068: การทำธุรกรรมที่ มีโปรแกรมควบคุม ODBC Microsoft Access 7

หมายเหตุนี้อธิบายถึงวิธีการทำธุรกรรมเมื่อใช้คลาสที่ฐานข้อมูล 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ซึ่งคุณสามารถเรียกได้เริ่มต้นธุรกรรมหลังจากที่คุณยอมรับหรือเรียกคืนแรกถัดไป เมื่อต้องการเขียนเช่นฟังก์ชัน ทำขั้นตอนต่อไปนี้:

  1. คัดลอกโค้ดสำหรับCRecordset::Requery ()ฟังก์ชันใหม่?

  2. เพิ่มบรรทัดต่อไปนี้ทันทีหลังจากการเรียกไปยังSQLFreeStmt:
    m_pDatabase-gt;BeginTrans(& );

ขณะนี้ คุณสามารถเรียกใช้ฟังก์ชันนี้ระหว่างแต่ละคู่ของธุรกรรม:

/ / เริ่มธุรกรรม 1 และ / / เปิดชุดระเบียน
dbBeginTrans ()
อาร์เอสเปิด()

/ / จัดการข้อมูล

/ / จบธุรกรรม 1
dbCommitTrans () nbsp / / หรือย้อนกลับ()

/ / ปิดเคอร์เซอร์ เริ่มต้นธุรกรรมใหม่
/ / และรับชุดผลลัพธ์
อาร์เอสRequeryWithBeginTrans ()

/ / จัดการข้อมูล

/ / จบธุรกรรม 2
dbCommitTrans ()  / / หรือย้อนกลับ()(&N)

หมายเหตุnbsp  ใช้เทคนิคนี้ถ้าคุณต้องการเปลี่ยนชุดระเบียนสมาชิกตัวแปรm_strFilterหรือm_strSortระหว่างธุรกรรม ในกรณีนี้ คุณควรปิดชุดระเบียนหลังจากที่การดำเนินการแต่ละCommitTransหรือย้อนกลับ(&N)?

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

Index