Поделиться через


Вызов SQLSetPos

В ODBC 2.x указатель на массив состояния строки был аргументом SQLExtendedFetch. Массив состояния строки позже был обновлен вызовом SQLSetPos. Некоторые драйверы полагаются на то, что этот массив не изменяется между SQLExtendedFetch и SQLSetPos. В ODBC 3.x указатель на массив состояния является полем дескриптора, поэтому приложение может легко изменить его для указания на другой массив. Это может быть проблема, когда приложение ODBC 3.x работает с драйвером ODBC 2.x, но вызывает SQLSetStmtAttr, чтобы задать указатель состояния массива и вызывает SQLFetchScroll для получения данных. Диспетчер драйверов сопоставляет его как последовательность вызовов SQLExtendedFetch. В следующем коде ошибка обычно возникает при сопоставлении второго вызова SQLSetStmtAttr при работе с драйвером 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);  

Ошибка возникает, если не было способа изменить указатель состояния строки в ODBC 2.x между вызовами SQLExtendedFetch. Вместо этого диспетчер драйверов выполняет следующие действия при работе с драйвером ODBC 2.x :

  1. Инициализирует внутренний флаг диспетчера драйверов fSetPosError в TRUE.

  2. Когда приложение вызывает SQLFetchScroll, диспетчер драйверов устанавливает значение false для fSetPosError .

  3. Когда приложение вызывает SQLSetStmtAttr для задания SQL_ATTR_ROW_STATUS_PTR, диспетчер драйверов устанавливает fSetPosError равнымTRUE.

  4. Когда приложение вызывает SQLSetPos с fSetPosError равным TRUE, диспетчер драйверов вызывает SQL_ERROR с SQLSTATE HY011 (атрибут не может быть задан сейчас), чтобы указать, что приложение попыталось вызвать SQLSetPos после изменения указателя состояния строки, но до вызова SQLFetchScroll.