다음을 통해 공유


SQLSetPos 호출

ODBC 2.x에서 행 상태 배열에 대한 포인터는 SQLExtendedFetch에 대한 인수였습니다. 행 상태 배열은 나중에 SQLSetPos 호출로 업데이트되었습니다. 일부 드라이버는 이 배열이 SQLExtendedFetch와 SQLSetPos 간에 변경되지 않는다는 사실에 의존했습니다. ODBC 3.x에서 상태 배열에 대한 포인터는 설명자 필드이므로 애플리케이션에서 쉽게 다른 배열을 가리키도록 변경할 수 있습니다. ODBC 3.x 애플리케이션이 ODBC 2.x 드라이버로 작업하지만 SQLSetStmtAttr를 호출하여 배열 상태 포인터를 설정하고 SQLFetchScroll을 호출하여 데이터를 가져오는 경우 문제가 될 수 있습니다. 드라이버 관리자는 이를 SQLExtendedFetch에 대한 호출 시퀀스로 매핑합니다. 다음 코드에서는 일반적으로 드라이버 관리자가 ODBC 2.x 드라이버로 작업할 때 두 번째 SQLSetStmtAttr 호출을 매핑할 때 오류가 발생합니다.

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 호출 간에 ODBC 2.x에서 행 상태 포인터를 변경할 방법이 없는 경우 오류가 발생합니다. 대신 드라이버 관리자는 ODBC 2.x 드라이버로 작업할 때 다음 단계를 수행합니다.

  1. 내부 드라이버 관리자 플래그 fSetPosError 를 TRUE로 초기화합니다.

  2. 애플리케이션이 SQLFetchScroll을 호출하면 드라이버 관리자는 fSetPosError를 FALSE로 설정합니다.

  3. 애플리케이션이 SQLSetStmtAttr을 호출하여 SQL_ATTR_ROW_STATUS_PTR 설정하면 드라이버 관리자는 fSetPosError를TRUE와 동일하게 설정합니다.

  4. 애플리케이션이 FSetPosError가 TRUE와 같은 SQLSetPos를 호출할 때 드라이버 관리자는 SQLSTATE HY011을 사용하여 SQL_ERROR 발생합니다(특성은 지금 설정할 수 없음). 이는 애플리케이션이 행 상태 포인터를 변경한 후 SQLFetchScroll을 호출하기 전에 SQLSetPos를 호출하려고 했음을 나타냅니다.