SQLSetPos'ı çağırma

ODBC 2.x'te, satır durumu dizisinin işaretçisi SQLExtendedFetch'in bağımsız değişkeniydi. Satır durum dizisi daha sonra SQLSetPos çağrısıyla güncelleştirildi. Bazı sürücüler, bu dizinin SQLExtendedFetch ile SQLSetPos arasında değişmediği gerçeğine dayanır. ODBC 3.x'te durum dizisi işaretçisi bir tanımlayıcı alanıdır ve bu nedenle uygulama bunu kolayca farklı bir diziye işaret etmek için değiştirebilir. Bir ODBC 3.x uygulaması ODBC 2.x sürücüsüyle çalışırken, dizi durum işaretçisini ayarlamak için SQLSetStmtAttr'ı çağırdığında ve verileri getirmek için SQLFetchScroll'ı çağırdığında bu sorun olabilir. Driver Manager bunu SQLExtendedFetch çağrısı dizisi olarak eşler. Aşağıdaki kodda, bir ODBC 2.x sürücüsüyle çalışırken Sürücü Yöneticisi ikinci SQLSetStmtAttr çağrısını eşlediğinde normalde bir hata oluşur:

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);  

SQLExtendedFetch çağrıları arasında ODBC 2.x'teki satır durumu işaretçisini değiştirmenin bir yolu yoksa hata oluşur. Bunun yerine, Sürücü Yöneticisi bir ODBC 2.x sürücüsüyle çalışırken aşağıdaki adımları gerçekleştirir:

  1. fSetPosError dahili bir Driver Manager bayrağını TRUE olarak ayarlanmasını sağlar.

  2. Bir uygulama SQLFetchScroll'ı çağırdığında, Driver Manager fSetPosError'ı FALSE olarak ayarlar.

  3. Uygulama, SQL_ATTR_ROW_STATUS_PTR ayarlamak için SQLSetStmtAttr'ı çağırdığında, Sürücü Yöneticisi fSetPosError'ı TRUE olarak ayarlar.

  4. Uygulama SQLSetPos'u çağırdığında, fSetPosError true değerine eşit olduğunda Driver Manager, sqlstate HY011 (Öznitelik şimdi ayarlanamaz) ile SQL_ERROR yükselterek, uygulamanın satır durumu işaretçisini değiştirdikten sonra ancak SQLFetchScroll'u çağırmadan önce SQLSetPos'u çağırmaya çalışıldığını gösterir.