Gezochte uitspraken construeren

Important

Deze functie wordt verwijderd in een toekomstige versie van Windows. Vermijd het gebruik van deze functie in nieuwe ontwikkelwerkzaamheden en plan om toepassingen te wijzigen die deze functie momenteel gebruiken. Microsoft raadt aan de cursorfunctionaliteit van het stuurprogramma te gebruiken.

Om positioneerde update- en delete-statements te ondersteunen, construeert de cursorbibliotheek een gezocht UPDATE of DELETE statement uit de positioneerde statement. Om aanroepen naar SQLGetData in een datablok te ondersteunen, construeert de cursorbibliotheek een doorzocht SELECT-statement om een resultaatset te creëren met de huidige datarij. In elk van deze statements somt de WHERE-clausule de waarden op die in de cache zijn opgeslagen voor elke gebonden kolom die SQL_PRED_SEARCHABLE of SQL_PRED_BASIC teruggeeft voor de SQL_DESC_SEARCHABLE veldidentificatie in SQLColAttribute.

Caution

De WHERE-clausule die door de cursorbibliotheek wordt geconstrueerd om de huidige rij te identificeren, kan falen in het identificeren van rijen, een andere rij of meer dan één rij identificeren.

Als een gepositioneerde update- of delete-instructie meer dan één rij beïnvloedt, werkt de cursorbibliotheek de rijstatusarray alleen bij voor de rij waarop de cursor is geplaatst en retourneert SQL_SUCCESS_WITH_INFO en SQLSTATE 01001 (cursoroperatieconflict veroorzaakt). Als de instructie geen rijen identificeert, werkt de cursorbibliotheek de statusarray van de rij niet bij en geeft SQL_SUCCESS_WITH_INFO en SQLSTATE 01001 terug (cursoroperatieconflict). Een applicatie kan SQLRowCount aanroepen om het aantal rijen te bepalen dat is bijgewerkt of verwijderd.

Als de SELECT-clausule die wordt gebruikt om de cursor te positioneren voor een aanroep naar SQLGetData meer dan één rij identificeert, is SQLGetData niet gegarandeerd dat de juiste gegevens teruggeven. Als er geen rijen worden geïdentificeerd, geeft SQLGetData SQL_NO_DATA terug.

Als een applicatie voldoet aan de volgende richtlijnen, zou de WHERE-clausule die door de cursorbibliotheek is geconstrueerd de huidige rij uniek moeten identificeren, behalve wanneer dit onmogelijk is, bijvoorbeeld wanneer de databron dubbele rijen bevat.

  • Bind kolommen die de rij uniek identificeren. Als de gebonden kolommen de rij niet uniek identificeren, kan de WHERE-clausule die door de cursorbibliotheek wordt geconstrueerd meer dan één rij identificeren. In een positioned update- of delete-instructie kan zo'n clausule ervoor zorgen dat meer dan één rij wordt bijgewerkt of verwijderd. Bij een aanroep naar SQLGetData kan zo'n clausule ervoor zorgen dat de driver gegevens teruggeeft voor de verkeerde rij. Het binden van alle kolommen in een unieke sleutel garandeert dat elke rij uniek wordt geïdentificeerd.

  • Wees databuffers toe die groot genoeg zijn zodat er geen afkap plaatsvindt. De cache van de cursorbibliotheek is een kopie van de waarden in de rowset-buffers die met SQLBindCol aan de resultaatset zijn gekoppeld. Als data wordt afgekapt wanneer deze in deze buffers wordt geplaatst, wordt deze ook in de cache afgekapt. Een WHERE-clausule die is geconstrueerd uit afgeknotte waarden identificeert mogelijk niet correct de onderliggende rij in de databron.

  • Specificeer niet-null lengte buffers voor binaire C-data. De cursorbibliotheek wijst lengtebuffers alleen toe in zijn cache als het StrLen_or_IndPtr-argument in SQLBindCol niet-null is. Wanneer het TargetType-argument SQL_C_BINARY, vereist de cursorbibliotheek de lengte van de binaire data om een WHERE-clausule uit de data te construeren. Als er geen lengtebuffer is voor een SQL_C_BINARY kolom en de applicatie SQLGetData aanroept of probeert een gepositioneerde update- of delete-instructie uit te voeren, geeft de cursorbibliotheek SQL_ERROR en SQLSTATE SL014 terug (Er is een gepositioneerd verzoek ingediend en niet alle kolomtellingsvelden zijn gebufferd).

  • Specificeer niet-null lengte buffers voor nullable kolommen. De cursorbibliotheek wijst lengtebuffers alleen toe in zijn cache als het StrLen_or_IndPtr-argument in SQLBindCol niet-null is. Omdat SQL_NULL_DATA in de lengtebuffer wordt opgeslagen, gaat de cursorbibliotheek ervan uit dat elke kolom waarvoor geen lengtebuffer is gespecificeerd niet-nul is. Als er geen kolom van lengte is opgegeven voor een nullable kolom, construeert de cursorbibliotheek een WHERE-clausule die de datawaarde voor de kolom gebruikt. Deze clausule zal de rij niet correct identificeren.