Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Important
Den här funktionen tas bort i en framtida version av Windows. Undvik att använda den här funktionen i nytt utvecklingsarbete och planera att ändra program som för närvarande använder den här funktionen. Microsoft rekommenderar att du använder drivrutinens markörfunktioner.
För att stödja positionerade uppdaterings- och borttagningssatser konstruerar markörbiblioteket ett sökt UPDATE eller DELETE uttalande från positionerade satsen. För att stödja anrop till SQLGetData i ett datablock konstruerar markörbiblioteket en sökt SELECT-sats för att skapa en resultatmängd som innehåller den aktuella dataraden. I varje av dessa satser räknar WHERE-klausulen upp värdena som lagras i cachen för varje bunden kolumn som returnerar SQL_PRED_SEARCHABLE eller SQL_PRED_BASIC för fältidentifieraren SQL_DESC_SEARCHABLE i SQLColAttribute.
Caution
WHERE-klausulen som konstrueras av markörbiblioteket för att identifiera den aktuella raden kan misslyckas med att identifiera några rader, identifiera en annan rad eller identifiera mer än en rad.
Om en positionerad uppdatering eller delete-sats påverkar mer än en rad uppdaterar markörbiblioteket radstatusarrayen endast för den rad där markören är placerad och returnerar SQL_SUCCESS_WITH_INFO och SQLSTATE 01001 (kursoroperationskonflikt). Om satsen inte identifierar några rader uppdaterar inte markörbiblioteket radstatusarrayen utan returnerar SQL_SUCCESS_WITH_INFO och SQLSTATE 01001 (pekaroperationskonflikt). En applikation kan anropa SQLRowCount för att bestämma antalet rader som uppdaterats eller raderats.
Om SELECT-klausulen som används för att positionera markören för ett anrop till SQLGetData identifierar mer än en rad, är SQLGetData inte garanterat att returnera rätt data. Om den inte identifierar några rader returnerar SQLGetData SQL_NO_DATA.
Om en applikation följer följande riktlinjer bör WHERE-klausulen som konstrueras av markörbiblioteket unikt identifiera den aktuella raden, utom när detta är omöjligt, till exempel när datakällan innehåller dubbletter av rader.
Bind kolumner som entydigt identifierar raden. Om de bundna kolumnerna inte entydigt identifierar raden kan WHERE-klausulen som konstrueras av markörbiblioteket identifiera mer än en rad. I en positionerad uppdaterings- eller borttagningssats kan en sådan klausul orsaka att mer än en rad uppdateras eller raderas. Vid ett anrop till SQLGetData kan en sådan klausul få drivrutinen att returnera data för fel rad. Att binda alla kolumner i en unik nyckel garanterar att varje rad är unikt identifierad.
Allokera databuffertar som är tillräckligt stora för att ingen trunkering ska ske. Markörbibliotekets cache är en kopia av värdena i raduppsättningsbuffertarna som är bundna till resultatmängden med SQLBindCol. Om data trunkeras när den placeras i dessa buffertar, kommer den också att trunkeras i cachen. En WHERE-klausul konstruerad av trunkerade värden kanske inte korrekt identifierar den underliggande raden i datakällan.
Ange buffertar med icke-null längd för binär C-data. Markörbiblioteket tilldelar längdbuffertar i sin cache endast om StrLen_or_IndPtr-argumentet i SQLBindCol är icke-null. När TargetType-argumentet är SQL_C_BINARY kräver markörbiblioteket längden på den binära datan för att konstruera en WHERE-klausul från datan. Om det inte finns någon längdbuffert för en SQL_C_BINARY kolumn och applikationen anropar SQLGetData eller försöker köra en positionerad uppdatering eller borttagningssats, returnerar markörbiblioteket SQL_ERROR och SQLSTATE SL014 (En positionerad begäran utfärdades och inte alla kolumnräkningsfält buffrades).
Ange buffertar med icke-null längd för nullbara kolumner. Markörbiblioteket tilldelar längdbuffertar i sin cache endast om StrLen_or_IndPtr-argumentet i SQLBindCol är icke-null. Eftersom SQL_NULL_DATA lagras i längdbufferten antar markörbiblioteket att varje kolumn där ingen längdbuffert anges är icke-nullbar. Om ingen längdkolumn anges för en nullbar kolumn, konstruerar markörbiblioteket en WHERE-klausul som använder datavärdet för kolumnen. Denna klausul kommer inte att korrekt identifiera raden.