TN042: คำแนะนำสำหรับนักพัฒนาโปรแกรมควบคุม ODBC

หมายเหตุนี้อธิบายถึงแนวทางสำหรับผู้เขียนโปรแกรมควบคุม ODBC สรุปข้อกำหนดทั่วไปและสมมติฐานของฟังก์ชัน ODBC ซึ่งทำให้ฐานข้อมูล MFC คลาสที่ และรายละเอียดการทางตรรกที่คาดการณ์ต่าง ๆ อธิบายฟังก์ชันการทำงานโปรแกรมควบคุมที่จำเป็นเพื่อสนับสนุนสามCRecordsetเปิดโหมด (forwardOnly, snapshot ของและdynaset)?

เคอร์เซอร์ไลบรารีของ ODBC

ฐานข้อมูล MFC คลาสที่นำเสนอฟังก์ชันที่ผู้ใช้ซึ่งในหลายกรณีช่วยการทำงานโดยโปรแกรมควบคุม ODBC ระดับ 1 ส่วนใหญ่ โชคดี ODBC ของเคอร์เซอร์ไลบรารีจะชั้นเองระหว่างเรียนฐานข้อมูลและโปรแกรมควบคุม และจะโดยอัตโนมัติให้มากงานนี้เพิ่มเติม?

ตัวอย่าง ไดรเวอร์ 1.0 ส่วนใหญ่ไม่สนับสนุนการเลื่อนไปข้างหลัง เคอร์เซอร์ไลบรารีสามารถตรวจพบนี้ จะแคแถวจากโปรแกรมควบคุม และนำเสนอเหล่านั้นตามที่ร้องขอบนเรียก FETCH_PREV ในSQLExtendedFetch?

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

ไลบรารีคลาสไม่เคยทำให้ใช้หลาย rowsets ดังนั้น คำสั่งSQLSetPosไม่กี่มีการนำไปใช้กับแถวที่ 1 ของ rowset เสมอ?

CDatabases

แต่ละCDatabaseจัดสรรแบบเดียวHDBC ปัน (หากมีใช้ฟังก์ชันExecuteSQL CDatabaseของHSTMTเป็นชั่วคราวส่วน) ดังนั้น ถ้าจำเป็นต้องใช้หลายCDatabaseของ s HDBCหลายต่อHENVต้องได้รับการสนับสนุน?

ชั้นฐานข้อมูลต้องให้เคอร์เซอร์ไลบรารี นี้จะสะท้อนให้เห็นในSQLSetConnectionsโทรSQL_ODBC_CURSORS, SQL_CUR_USE_ODBC?

SQLDriverConnect, SQL_DRIVER_COMPLETEถูกใช้โดยCDatabase::Openเมื่อต้องการสร้างการเชื่อมต่อไปยังแหล่งข้อมูล?

โปรแกรมควบคุมที่ต้องสนับสนุน gt SQLGetInfo SQL_ODBC_API_CONFORMANCE ; SQL_OAC_LEVEL1, SQLGetInfo SQL_ODBC_SQL_CONFORMANCE = > = SQL_OSC_MINIMUM?

เพื่อให้ได้รับการสนับสนุนสำหรับการCDatabaseและชุดระเบียนที่อ้างอิงของธุรกรรมSQLGetInfo SQL_CURSOR_COMMIT_BEHAVIORและSQL_CURSOR_ROLLBACK_BEHAVIORต้องมีSQL_CR_PRESERVE มิฉะนั้น ความพยายามในการทำธุรกรรมควบคุมจะถูกละเว้น?

SQLGetInfo SQL_DATA_SOURCE_READ_ONLYต้องได้รับการสนับสนุน ถ้าจะส่งกลับค่า "Y" ไม่มีการดำเนินการปรับปรุงจะดำเนินการในแหล่งข้อมูล?

ถ้ามีเปิดCDatabaseการอ่านความพยายามในการตั้งค่าการอ่านแหล่งข้อมูลจะเกิดขึ้นกับSQLSetConnectOption SQL_ACCESS_MODE, SQL_MODE_READ_ONLY?

ถ้าตัวระบุต้องการส่วน ข้อมูลนี้ควรถูกส่งกลับจากโปรแกรมควบคุมที่มีการเรียกSQL_IDENTIFIER_QUOTE_CHAR SQLGetInfo ?

สำหรับวัตถุประสงค์ในการดีบักSQLGetInfo SQL_DBMS_VERและSQL_DBMS_NAMEถูกเรียกจากไดรเวอร์?

SQLSetStmtOption SQL_QUERY_TIMEOUTและSQL_ASYNC_ENABLEอาจถูกเรียกบนตัวCDatabaseของHDBC?

SQLErrorอาจจะเรียกว่า มีอาร์กิวเมนต์ใด ๆ หรือทั้งหมดเป็น NULL?

แน่นอนSQLAllocEnv, SQLAllocConnect, SQLDisconnectและSQLFreeConnectต้องได้รับการสนับสนุน?

ExecuteSQL

ในเพิ่มเติมการปันส่วน และการเพิ่มแบบชั่วคราวHSTMT, ExecuteSQLเรียกSQLExecDirect, SQLFetch, SQLNumResultColและSQLMoreResults SQLCancelอาจถูกเรียกบนตัวHSTMT?

GetDatabaseName

SQLGetInfo SQL_DATABASE_NAMEจะถูกเรียก?

BeginTrans, CommitTrans ย้อนกลับ

SQLSetConnectOption SQL_AUTOCOMMITและSQLTransact SQL_COMMIT, SQL_ROLLBACKและSQL_AUTOCOMMITจะมีชื่อว่าถ้าจะทำการร้องขอของธุรกรรม?

CRecordsets

SQLAllocStmt, SQLPrepare, SQLExecute (สำหรับเปิดและสอบถามใหม่อีก), SQLExecDirect (สำหรับการดำเนินการปรับปรุง) SQLFreeStmtต้องได้รับการสนับสนุน SQLNumResultColsและSQLDescribeColจะถูกเรียกว่าผลลัพธ์ที่กำหนดในช่วงเวลาต่าง ๆ?

SQLSetParamถูกใช้อย่างกว้างขวางสำหรับการผูกข้อมูลพารามิเตอร์และฟังก์ชันการทำงานของDATA_AT_EXEC?

SQLBindColถูกใช้อย่างกว้างขวางในการลงทะเบียนแสดงผลตำแหน่งคอลัมน์ข้อมูลใช้เก็บกับ ODBC?

SQLGetDataสายที่สองจะใช้เพื่อรับข้อมูลSQL_LONG_VARCHARและSQL_LONG_VARBINARY สายแรกพยายามค้นหาความยาวรวมของค่าในคอลัมน์ โดยการเรียกSQLGetData cbMaxValue 0 แต่ กับ pcbValue ถูกต้อง ถ้า pcbValue ยังคงSQL_NO_TOTALข้อยกเว้นถูกส่งออกไป มิฉะนั้น จะถูกจัดสรรการHGLOBALและทำอีกSQLGetDataโทรเรียกผลลัพธ์ทั้งหมด?

การปรับปรุง

ถ้ามองในแง่ร้ายล็อกมีการร้องขอSQLGetInfo SQL_LOCK_TYPESจะสามารถสอบถาม ถ้าไม่สนับสนุนSQL_LCK_EXCLUSIVEข้อยกเว้นจะถูกส่งออกไป?

ความพยายามในการปรับปรุงแบบCRecordset (snapshot ของหรือdynaset) จะทำให้เกิดเป็นสองHSTMTการปันส่วน สำหรับโปรแกรมควบคุมที่ไม่สนับสนุนสองHSTMTเคอร์เซอร์ไลบรารีจะจำลองการทำงานนี้ ขออภัย ซึ่งอาจบางครั้งหมาย บังคับให้แบบสอบถามปัจจุบันบนตัวแรกที่HSTMTเพื่อความสมบูรณ์ก่อนการประมวลผลการร้องขอสองHSTMTของ?

SQLFreeStmt SQL_CLOSEและSQL_RESET_PARAMSและSQLGetCursorNameจะถูกเรียกว่าระหว่างการดำเนินการปรับปรุง?

ถ้าไม่มีCLongBinarysในการoutputColumnsฟังก์ชันการทำงานของ ODBC ของDATA_AT_EXECต้องได้รับการสนับสนุน ซึ่งรวมถึงการกลับมาSQL_NEED_DATAจากSQLExecDirect, SQLParamDataและSQLPutData?

เรียกว่าหลังจากการดำเนินการเพื่อตรวจสอบว่า มีการปรับปรุงระเบียนเพียง 1 โดยSQLExecDirect SQLRowCount?

ForwardOnly เคอร์เซอร์

เท่านั้นที่SQLFetchที่จำเป็นสำหรับการดำเนินการย้ายได้ หมายเหตุว่าforwardOnlyเคอร์เซอร์ไม่สนับสนุนการปรับปรุง?

Snapshot ของเคอร์เซอร์

Snapshot ของฟังก์ชันต้องการการสนับสนุนSQLExtendedFetch ดังที่กล่าวไว้ข้างต้น ODBC เคอร์เซอร์ไลบรารีจะตรวจพบเมื่อโปรแกรมควบคุมที่ไม่สนับสนุนSQLExtendedFetchและให้การสนับสนุนจำเป็นตัวเอง?

SQLGetInfo, SQL_SCROLL_OPTIONSต้องสนับสนุนSQL_SO_STATIC?

Dynaset เคอร์เซอร์

ข้างล่างนี้คือการสนับสนุนขั้นต่ำที่จำเป็นต้องเปิด dynaset:

SQLGetInfo, SQL_ODBC_VERต้องส่งกลับ gt "01"(&G)?

SQLGetInfo, SQL_SCROLL_OPTIONSต้องสนับสนุนSQL_SO_KEYSET_DRIVEN?

SQLGetInfo, SQL_ROW_UPDATESต้องส่งกลับ "Y"?

SQLGetInfo, SQL_POSITIONED_UPDATESต้องสนับสนุนSQL_PS_POSITIONED_DELETEและSQL_PS_POSITIONED_UPDATE?

นอกจากนี้ ถ้ามองในแง่ร้ายล็อกมีการร้องขอ การเรียกไปยังSQLSetPos irow 1, fRefresh FALSE และฝูงSQL_LCK_EXCLUSIVEจะเกิดขึ้น?

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

Index