Bagikan melalui


Memanggil SQLSetPos

Di ODBC 2.x, penunjuk ke array status baris adalah argumen ke SQLExtendedFetch. Array status baris kemudian diperbarui oleh panggilan ke SQLSetPos. Beberapa driver telah mengandalkan fakta bahwa array ini tidak berubah antara SQLExtendedFetch dan SQLSetPos. Di ODBC 3.x, penunjuk ke array status adalah bidang deskriptor dan oleh karena itu aplikasi dapat dengan mudah mengubahnya untuk menunjuk ke array yang berbeda. Ini bisa menjadi masalah ketika aplikasi ODBC 3.x bekerja dengan driver ODBC 2.x tetapi memanggil SQLSetStmtAttr untuk mengatur penunjuk status array dan memanggil SQLFetchScroll untuk mengambil data. Driver Manager memetakannya sebagai urutan panggilan ke SQLExtendedFetch. Dalam kode berikut, kesalahan biasanya akan muncul ketika Manajer Driver memetakan panggilan SQLSetStmtAttr kedua saat bekerja dengan driver ODBC 2.x:

SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_STATUS_PTR, rgfRowStatus, 0);  
SQLFetchScroll(hstmt, fFetchType, iRow);  
SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_STATUS_PTR, rgfRowStat1, 0);  
SQLSetPos(hstmt, iRow, fOption, fLock);  

Kesalahan akan muncul jika tidak ada cara untuk mengubah penunjuk status baris di ODBC 2.x antara panggilan ke SQLExtendedFetch. Sebagai gantinya, Driver Manager melakukan langkah-langkah berikut saat bekerja dengan driver ODBC 2.x :

  1. Menginisialisasi bendera Driver Manager internal fSetPosError ke TRUE.

  2. Ketika aplikasi memanggil SQLFetchScroll, Driver Manager mengatur fSetPosError ke FALSE.

  3. Ketika aplikasi memanggil SQLSetStmtAttr untuk mengatur SQL_ATTR_ROW_STATUS_PTR, Driver Manager mengatur fSetPosError sama dengan toTRUE.

  4. Ketika aplikasi memanggil SQLSetPos, dengan fSetPosError sama dengan TRUE, Manajer Driver menaikkan SQL_ERROR dengan SQLSTATE HY011 (Atribut tidak dapat diatur sekarang) untuk menunjukkan bahwa aplikasi mencoba memanggil SQLSetPos setelah mengubah penunjuk status baris tetapi sebelum memanggil SQLFetchScroll.