Dela via


Skicka omfattande data

DBMS definierar långa data som alla tecken eller binära data över en viss storlek, till exempel 254 tecken. Det kanske inte går att lagra ett helt objekt med långa data i minnet, till exempel när objektet representerar ett långt textdokument eller en bitmapp. Eftersom sådana data inte kan lagras i en enda buffert skickar datakällan dem till drivrutinen i delar med SQLPutData när instruktionen körs. Parametrar för vilka data skickas vid körningstillfället kallas data-vid-körning-parametrar.

Anmärkning

En applikation kan faktiskt skicka alla typer av data vid körningstid med SQLPutData, men endast tecken- och binärdata 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.

För att skicka data vid körningen utför programmet följande åtgärder:

  1. Skickar ett 32-bitarsvärde som identifierar parametern i argumentet ParameterValuePtr i SQLBindParameter i stället för att skicka adressen till en buffert. Det här värdet analyseras inte av drivrutinen. Det kommer att returneras till programmet senare, så det bör betyda något för programmet. Det kan till exempel vara antalet parametrar eller hanteraren för en fil som innehåller data.

  2. Skickar adressen till en längd-/indikatorbuffert i argumentet StrLen_or_IndPtrför SQLBindParameter.

  3. Lagrar SQL_DATA_AT_EXEC eller resultatet av makrot SQL_LEN_DATA_AT_EXEC(längd) i längden/indikatorbufferten. Båda dessa värden anger för drivrutinen att data för parametern skickas med SQLPutData. SQL_LEN_DATA_AT_EXEC(längd) 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.

  4. Anropar SQLExecute eller SQLExecDirect. Drivrutinen upptäcker att en längd-/indikatorbuffert innehåller värdet SQL_DATA_AT_EXEC eller resultatet av makrot SQL_LEN_DATA_AT_EXEC(längd) och returnerar SQL_NEED_DATA som funktionens returvärde.

  5. 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 pekas på av argumentet ValuePtrPtr returnerar drivrutinen det värde som identifierar parametern data-at-execution. Om det finns mer än en data-at-execution-parameter måste programmet använda det här värdet för att avgöra vilken parameter som data ska skickas för. Drivrutinen behöver inte begära data för data-at-execution-parametrar i någon särskild ordning.

  6. Anropar SQLPutData för att skicka parameterdata till drivrutinen. Om parameterdata inte passar in 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.

  7. Anropar SQLParamData igen för att indikera att alla data för parametern har skickats. Om det finns några data-at-execution-parametrar för vilka data inte har skickats, returnerar drivrutinen SQL_NEED_DATA och värdet som identifierar nästa parameter. programmet återgår till steg 6. Om data har skickats för alla data-at-execution-parametrar, körs instruktionen. SQLParamData returnerar SQL_SUCCESS eller SQL_SUCCESS_WITH_INFO och kan returnera valfritt returvärde eller diagnostik som SQLExecute eller SQLExecDirect kan returnera.

När SQLExecute eller SQLExecDirect returnerar SQL_NEED_DATA och innan data har skickats helt för den senaste data-at-execution-parametern är instruktionen i tillståndet Behov av data. Även om en instruktion är i tillståndet Behöver data kan programmet endast 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.

Ett exempel på hur du skickar data under körning finns i SQLPutData-funktionsbeskrivningen.