Delen via


SQLSetPos aanroepen

In ODBC 2.x was de aanwijzer naar de rijstatusmatrix een argument voor SQLExtendedFetch. De rijstatusmatrix is later bijgewerkt door een aanroep naar SQLSetPos. Sommige stuurprogramma's hebben gebruikgemaakt van het feit dat deze matrix niet verandert tussen SQLExtendedFetch en SQLSetPos. In ODBC 3.x is de aanwijzer naar de statusmatrix een descriptorveld en kan de toepassing deze daarom eenvoudig wijzigen zodat deze verwijst naar een andere matrix. Dit kan een probleem zijn wanneer een ODBC 3.x-toepassing werkt met een ODBC 2.x-stuurprogramma , maar SQLSetStmtAttr aanroept om de matrixstatusaanwijzer in te stellen en SQLFetchScroll aanroept om gegevens op te halen. Driver Manager kaart deze als een opeenvolging van aanroepen naar SQLExtendedFetch. In de volgende code wordt normaal gesproken een fout gegenereerd wanneer Driver Manager de tweede SQLSetStmtAttr-aanroep toewijst bij het werken met een ODBC 2.x-stuurprogramma :

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

De fout wordt gegenereerd als er geen manier is om de rijstatusaanwijzer in ODBC 2.x te wijzigen tussen aanroepen naar SQLExtendedFetch. In plaats daarvan voert Driver Manager de volgende stappen uit bij het werken met een ODBC 2.x-stuurprogramma :

  1. Initialiseert een interne Driver Manager-vlag fSetPosError naar TRUE.

  2. Wanneer een toepassing SQLFetchScroll aanroept, stelt Driver Manager fSetPosError in op FALSE.

  3. Wanneer de toepassing SQLSetStmtAttr aanroept om SQL_ATTR_ROW_STATUS_PTR in te stellen, stelt Driver Manager fSetPosError gelijk aanTRUE in.

  4. Wanneer de toepassing SQLSetPos aanroept, waarbij fSetPosError gelijk is aan TRUE, genereert Driver Manager SQL_ERROR met SQLSTATE HY011 (kenmerk kan nu niet worden ingesteld) om aan te geven dat de toepassing HEEFT geprobeerd SQLSetPos aan te roepen na het wijzigen van de rijstatusaanwijzer, maar vóór het aanroepen van SQLFetchScroll.