Dela via


Long Data, SQLSetPos och SQLBulkOperations

Precis som med parametrar i SQL-uttryck kan långa data skickas när rader med SQLBulkOperations eller SQLSetPos uppdateras eller när rader med SQLBulkOperations infogas. Data skickas i delar med flera anrop till SQLPutData. Kolumner för vilka data skickas vid körningstillfället kallas kolumner för data vid körning.

Anmärkning

Ett program kan faktiskt skicka alla typer av data vid körning med SQLPutData, även om endast teckendata och binära data kan skickas i delar. Men om data är tillräckligt små för att få plats i en enda buffert finns det i allmänhet ingen anledning att använda SQLPutData. Det är mycket enklare att binda bufferten och låta drivrutinen hämta data från bufferten.

Eftersom långa datakolumner vanligtvis inte är bundna måste programmet binda kolumnen innan den anropar SQLBulkOperations eller SQLSetPos och avbindar den efter att ha anropat SQLBulkOperations eller SQLSetPos. Kolumnen måste vara bunden eftersom SQLBulkOperations eller SQLSetPos endast fungerar på bundna kolumner och måste vara obundna så att SQLGetData kan användas för att hämta data från kolumnen.

För att skicka data vid exekveringstid gör programmet följande:

  1. Placerar ett 32-bitars värde i raduppsättningsbufferten i stället för ett datavärde. Det här värdet kommer att returneras till programmet senare, så programmet bör ange det till ett meningsfullt värde, till exempel antalet kolumner eller handtaget för en fil som innehåller data.

  2. Anger värdet i längden/indikatorbufferten till resultatet av makrot SQL_LEN_DATA_AT_EXEC(längd). Det här värdet anger för drivrutinen att data för parametern skickas med SQLPutData. Längdvärdet används när långa data skickas till en datakälla som behöver veta hur många byte långa data som skickas så att de kan förallokera utrymme. För att avgöra om en datakälla kräver det här värdet anropar programmet SQLGetInfo med alternativet SQL_NEED_LONG_DATA_LEN. Alla drivrutiner måste ha stöd för det här makrot. Om datakällan inte kräver bytelängden kan drivrutinen ignorera den.

  3. Anropar SQLBulkOperations eller SQLSetPos. Drivrutinen upptäcker att en längd-/indikatorbuffert innehåller resultatet av makrot SQL_LEN_DATA_AT_EXEC(längd) och returnerar SQL_NEED_DATA som funktionens returvärde.

  4. Anropar SQLParamData som svar på SQL_NEED_DATA returvärdet. Om långa data behöver skickas returnerar SQLParamData SQL_NEED_DATA. I bufferten som ValuePtrPtr-argumentet pekar på, returnerar drivrutinen det unika värde som applikationen placerade i raduppsättningsbufferten. Om det finns mer än en data-at-execution-kolumn använder programmet det här värdet för att bestämma vilken kolumn data ska skickas för. Drivrutinen behöver inte begära data för data-at-execution-kolumner i någon viss ordning.

  5. Anropar SQLPutData för att skicka kolumndata till drivrutinen. Om kolumndata inte får plats i en enda buffert, vilket ofta är fallet med långa data, anropar programmet SQLPutData upprepade gånger för att skicka data i delar. det är upp till drivrutinen och datakällan att sätta ihop data igen. Om programmet skickar null-avslutade strängdata måste drivrutinen eller datakällan ta bort null-avslutningstecknet som en del av återmonteringsprocessen.

  6. Anropar SQLParamData igen för att ange att alla data för kolumnen har skickats. Om det finns kolumner för data vid körning för vilka data inte har skickats, returnerar drivrutinen SQL_NEED_DATA och det unika värdet för nästa kolumn för data vid körning. Programmet återgår till steg 5. Om data har skickats för alla kolumner vid körning skickas data för raden till datakällan. SQLParamData returnerar sedan SQL_SUCCESS eller SQL_SUCCESS_WITH_INFO och kan returnera sqlstate som SQLBulkOperations eller SQLSetPos kan returnera.

När SQLBulkOperations eller SQLSetPos returnerar SQL_NEED_DATA och innan data har skickats helt för den sista kolumnen vid körning av data, befinner sig instruktionen i tillståndet Behöver data. I det här tillståndet kan programmet bara anropa SQLPutData, SQLParamData, SQLCancel, SQLGetDiagField eller SQLGetDiagRec. alla andra funktioner returnerar SQLSTATE HY010 (funktionssekvensfel). Att anropa SQLCancel avbryter körningen av -instruktionen och returnerar den till sitt tidigare tillstånd. Mer information finns i Bilaga B: ODBC-tillståndsövergångstabeller.