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.
Överensstämmelse
Version introducerad: ODBC 1.0 Standardefterlevnad: ISO 92
Summary
SQLPutData gör det möjligt för en applikation att skicka data för en parameter eller kolumn till drivrutinen vid satsexekveringstidpunkten. Denna funktion kan användas för att skicka tecken- eller binära datavärden i delar till en kolumn med en tecken-, binär- eller datakällspecifik datatyp (till exempel parametrar för SQL_LONGVARBINARY- eller SQL_LONGVARCHAR-typerna).
SQLPutData stödjer bindning till en Unicode C-datatyp, även om den underliggande drivrutinen inte stöder Unicode-data.
Syntax
SQLRETURN SQLPutData(
SQLHSTMT StatementHandle,
SQLPOINTER DataPtr,
SQLLEN StrLen_or_Ind);
Arguments
StatementHandle
[Indata] Instruktionshandtag.
DataPtr
[Input] Pekar på en buffert som innehåller den faktiska datan för parametern eller kolumnen. Datan måste finnas i C-datatypen som specificeras i ValueType-argumentet i SQLBindParameter (för parameterdata) eller TargetType-argumentet i SQLBindCol (för kolumndata).
StrLen_or_Ind
[Input] Längden på *DataPtr. Specificerar mängden data som skickas i ett anrop till SQLPutData. Mängden data kan variera vid varje anrop för en given parameter eller kolumn.
StrLen_or_Ind ignoreras om den inte uppfyller något av följande villkor:
StrLen_or_Ind är SQL_NTS, SQL_NULL_DATA eller SQL_DEFAULT_PARAM.
C-datatypen som specificeras i SQLBindParameter eller SQLBindCol är SQL_C_CHAR eller SQL_C_BINARY.
C-datatypen är SQL_C_DEFAULT, och standarddatatypen C för den angivna SQL-datatypen är SQL_C_CHAR eller SQL_C_BINARY.
För alla andra typer av C-data, om StrLen_or_Ind inte är SQL_NULL_DATA eller SQL_DEFAULT_PARAM, antar drivrutinen att storleken på *DataPtr-bufferten är storleken på C-datatypen som specificerats med ValueType eller TargetType och skickar hela datavärdet. För mer information, se Konvertera data från C till SQL-datatyper i bilaga D: Datatyper.
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_ERROR eller SQL_INVALID_HANDLE.
Diagnostics
När SQLPutData returnerar SQL_ERROR eller SQL_SUCCESS_WITH_INFO kan ett associerat SQLSTATE-värde erhållas genom att anropa SQLGetDiagRec med en HandleType av SQL_HANDLE_STMT och ett Handle av StatementHandle. Följande tabell listar de SQLSTATE-värden som vanligtvis returneras av SQLPutData och förklarar var och en i kontexten av denna funktion; notationen "(DM)" föregår beskrivningarna av SQLSTATE som returneras av Driver Manager. Returkoden som är associerad med varje SQLSTATE-värde är SQL_ERROR, om inget annat anges.
| SQLSTATE | Error | Beskrivning |
|---|---|---|
| 01000 | Allmän varning | Informationsmeddelande för drivrutinsspecifikt. (Funktionen returnerar SQL_SUCCESS_WITH_INFO.) |
| 01004 | Strängdata, höger trunkerade | Sträng- eller binärdata som returnerades för en utdataparameter resulterade i trunkering av icke-blanka tecken eller icke-NULL-binärdata. Om det var ett strängvärde trunkerades det korrekt. (Funktionen returnerar SQL_SUCCESS_WITH_INFO.) |
| 07006 | Attributöverträdelse för begränsad datatyp | Datavärdet som identifierades av argumentet ValueType i SQLBindParameter för den bundna parametern kunde inte konverteras till den datatyp som identifierades av ParameterType-argumentet i SQLBindParameter. |
| 07S01 | Ogiltig användning av standardparameter | Ett parametervärde som angavs med SQLBindParameter var SQL_DEFAULT_PARAM och motsvarande parameter hade inget standardvärde. |
| 08S01 | Kommunikationslänkfel | Kommunikationslänken mellan drivrutinen och datakällan som drivrutinen var ansluten till misslyckades innan funktionen slutförde bearbetningen. |
| 22001 | Strängdata, höger trunkering | Tilldelningen av ett tecken eller binärt värde till en kolumn resulterade i trunkering av icke-blanka (tecken) eller icke-null (binära) tecken eller byte. Den SQL_NEED_LONG_DATA_LEN informationstypen i SQLGetInfo var "Y", och mer data skickades för en lång parameter (datatypen var SQL_LONGVARCHAR, SQL_LONGVARBINARY eller en lång datakällsspecifik datatyp) än vad som specificerades med argumentet StrLen_or_IndPtr i SQLBindParameter. Den SQL_NEED_LONG_DATA_LEN informationstypen i SQLGetInfo var "Y", och mer data skickades för en lång kolumn (datatypen var SQL_LONGVARCHAR, SQL_LONGVARBINARY eller en lång datakällsspecifik datatyp) än vad som specificerades i den längdbuffert som motsvarade en kolumn i en rad data som lades till eller uppdaterades med SQLBulkOperations eller uppdaterades med SQLSetPos. |
| 22003 | Numeriskt värde som ligger utom intervallet | De data som skickades för en begränsad numerisk parameter eller kolumn orsakade att hela (till skillnad från bråkdelad) delen av numret avkortades när den tilldelades den tillhörande tabellkolumnen. Om du returnerade ett numeriskt värde (som numeriskt eller sträng) för en eller flera indata-/utdata- eller utdataparametrar skulle hela delen (i stället för bråktal) ha trunkerats. |
| 22007 | Ogiltigt datetime-format | Data som skickades för en parameter eller kolumn som var bunden till en datum-, tids- eller tidsstämpelstruktur var respektive ett ogiltigt datum, tid eller tidsstämpel. En indata-/utdata- eller utdataparameter var bunden till en C-struktur för datum, tid eller tidsstämpel, och ett värde i den returnerade parametern var ett ogiltigt datum, tid eller tidsstämpel. (Funktionen returnerar SQL_SUCCESS_WITH_INFO.) |
| 22008 | Datetime-fältspill | Ett datetime-uttryck som beräknats för en indata-/utdata- eller utdataparameter resulterade i en C-struktur för datum, tid eller tidsstämpel som var ogiltig. |
| 22012 | Division med noll | Ett aritmetiskt uttryck som beräknats för en indata-/utdata- eller utdataparameter resulterade i division med noll. |
| 22015 | Intervallfältsspill | Data som skickades för en exakt numerisk eller intervallkolumn eller parameter till en intervall-SQL-datatyp orsakade förlust av betydande siffror. Data skickades för en intervallkolumn eller parameter med mer än ett fält, konverterades till en numerisk datatyp och hade ingen representation i den numeriska datatypen. Data som skickades för kolumn- eller parameterdata tilldelades en intervall-SQL-typ, och det fanns ingen representation av värdet för C-typen i intervall-SQL-typen. Data som skickades för en exakt numerisk eller intervallkolumn eller parameter C till en intervall C-typ orsakade förlust av betydande siffror. Data som skickades för kolumn- eller parameterdata tilldelades en intervallstruktur C, och det fanns ingen representation av datan i intervalldatastrukturen. |
| 22018 | Ogiltigt teckenvärde för gjuten specifikation | C-typen var en exakt eller ungefärlig numerisk typ, en date-time eller en intervalldatatyp; kolumnens SQL-typ var en teckendatatyp; och värdet i kolumnen eller parametern var inte en giltig literal av den bundna typen C. SQL-typen var en exakt eller approximativ numerisk, en date-time eller en intervalldatatyp; C-typen var SQL_C_CHAR; och värdet i kolumnen eller parametern var inte en giltig literal av den bundna SQL-typen. |
| HY000 | Allmänt fel | Ett fel uppstod för vilket det inte fanns någon specifik SQLSTATE och för vilken ingen implementeringsspecifik SQLSTATE definierades. Felmeddelandet som returnerades av SQLGetDiagRec i *MessageText-bufferten beskriver felet och dess orsak. |
| HY001 | Fel vid minnesallokering | Drivrutinen kunde inte allokera minne som krävs för körning eller slutförande av funktionen. |
| HY008 | Åtgärden avbröts | Asynkron bearbetning aktiverades för StatementHandle. Funktionen anropades och innan körningen slutfördes anropades SQLCancel eller SQLCancelHandle på StatementHandle. Sedan anropades funktionen igen på StatementHandle. Funktionen anropades och innan körningen slutfördes anropades SQLCancel eller SQLCancelHandle på StatementHandle från en annan tråd i ett flertrådsprogram. |
| HY009 | Ogiltig användning av null-pekare | (DM) Argumentet DataPtr var en nullpekare, och argumentet StrLen_or_Ind var inte 0, SQL_DEFAULT_PARAM eller SQL_NULL_DATA. |
| HY010 | Funktionssekvensfel | (DM) Det föregående funktionsanropet var inte ett anrop till SQLPutData eller SQLParamData. (DM) En asynkront körande funktion anropades för anslutningshandtaget som är associerat med StatementHandle. Denna asynkrona funktion kördes fortfarande när SQLPutData-funktionen anropades. (DM) SQLExecute, SQLExecDirect eller SQLMoreResults anropades för StatementHandle och returnerades SQL_PARAM_DATA_AVAILABLE. Den här funktionen anropades innan data hämtades för alla strömmade parametrar. (DM) En asynkront körande funktion (inte den här) anropades för StatementHandle och kördes fortfarande när den här funktionen anropades. |
| HY013 | Minneshanteringsfel | Det gick inte att bearbeta funktionsanropet eftersom det inte gick att komma åt underliggande minnesobjekt, möjligen på grund av minnesbrist. |
| HY019 | Icke-tecken- och icke-binär data skickades i delar | SQLPutData anropades mer än en gång för en parameter eller kolumn, och det användes inte för att skicka tecken C-data till en kolumn med en tecken-, binär- eller datakällaspecifik datatyp eller för att skicka binär C-data till en kolumn med tecken-, binär- eller datakällsspecifik datatyp. |
| HY020 | Försök att sammanfoga ett nollvärde | SQLPutData anropades mer än en gång sedan anropet som returnerade SQL_NEED_DATA, och i ett av dessa anrop innehöll StrLen_or_Ind argumentet SQL_NULL_DATA eller SQL_DEFAULT_PARAM. |
| HY090 | Ogiltig sträng- eller buffertlängd | Argumentet DataPtr var inte en nullpekare, och argumentet StrLen_or_Ind var mindre än 0 men inte lika med SQL_NTS eller SQL_NULL_DATA. |
| HY117 | Anslutningen pausas på grund av okänt transaktionstillstånd. Endast frånkopplings- och skrivskyddade funktioner tillåts. | (DM) Mer information om pausat tillstånd finns i SQLEndTran-funktion. |
| HYT01 | Tidsgränsen för anslutningen gick ut | Tidsgränsen för anslutningen löpte ut innan datakällan svarade på begäran. Tidsgränsen för anslutningen anges via SQLSetConnectAttr, SQL_ATTR_CONNECTION_TIMEOUT. |
| IM001 | Drivrutinen stöder inte den här funktionen | (DM) Drivrutinen som är associerad med StatementHandle stöder inte funktionen. |
| IM017 | Avsökning är inaktiverat i asynkront meddelandeläge | När meddelandemodellen används inaktiveras avsökningen. |
| IM018 | SQLCompleteAsync har inte anropats för att slutföra den tidigare asynkrona åtgärden på det här handtaget. | Om det tidigare funktionsanropet på handtaget returnerar SQL_STILL_EXECUTING och om meddelandeläget är aktiverat måste SQLCompleteAsync anropas på handtaget för att utföra efterbearbetningen och slutföra åtgärden. |
Om SQLPutData anropas medan data för en parameter i en SQL-sats skickas kan den returnera vilken SQLSTATE som helst som kan returneras av funktionen som anropas för att köra satsen (SQLExecute eller SQLExecDirect). Om den anropas medan data skickas för en kolumn som uppdateras eller läggs till med SQLBulkOperations eller uppdateras med SQLSetPos, kan den returnera vilken SQLSTATE som helst som kan returneras av SQLBulkOperations eller SQLSetPos.
Comments
SQLPutData kan anropas för att tillhandahålla data vid exekveringsdata för två användningsområden: parameterdata som ska användas i ett anrop till SQLExecute eller SQLExecDirect, eller kolumndata som används när en rad uppdateras eller läggs till genom ett anrop till SQLBulkOperations eller uppdateras genom ett anrop till SQLSetPos.
När en applikation anropar SQLParamData för att avgöra vilken data den ska skicka, returnerar drivrutinen en indikator som applikationen kan använda för att avgöra vilka parameterdata som ska skickas eller var kolumndata kan hittas. Den returnerar också SQL_NEED_DATA, vilket är en indikator till applikationen att den ska anropa SQLPutData för att skicka data. I DataPtr-argumentet till SQLPutData skickar applikationen en pekare till bufferten som innehåller den faktiska datan för parametern eller kolumnen.
När drivrutinen returnerar SQL_SUCCESS för SQLPutData anropar applikationen SQLParamData igen. SQLParamData returnerar SQL_NEED_DATA om mer data behöver skickas, i vilket fall applikationen anropar SQLPutData igen. Den returnerar SQL_SUCCESS om all data vid exekveringen har skickats. Applikationen anropar sedan SQLParamData igen. Om drivrutinen returnerar SQL_NEED_DATA och en annan indikator i *ValuePtr, kräver den data för en annan parameter eller kolumn och SQLPutData anropas igen. Om drivrutinen returnerar SQL_SUCCESS har all data vid exekvering skickats och SQL-satsen kan exekveras eller anropet SQLBulkOperations eller SQLSetPos kan bearbetas.
För mer information om hur data-at-exekvering-parameterdata skickas vid satsexekveringstidpunkten, se "Passing Parameter Values" i SQLBindParameter och Sending Long Data. För mer information om hur data vid exekveringskolumn uppdateras eller läggs till, se avsnittet "Using SQLSetPos" i SQLSetPos, "Performing Bulk Updates Using Bookmarks" i SQLBulkOperations, samt Long Data och SQLSetPos och SQLBulkOperations.
Note
En applikation kan använda SQLPutData för att skicka data i delar endast när teckendata C skickas till en kolumn med en tecken-, binär- eller datakällspecifik datatyp eller när binär C-data skickas till en kolumn med en tecken-, binär- eller datakällasspecifik datatyp. Om SQLPutData anropas mer än en gång under andra förhållanden, returnerar det SQL_ERROR och SQLSTATE HY019 (icke-tecken- och icke-binär data skickad i delar).
Example
Följande exempel antar ett datakällnamn som heter Test. Den tillhörande databasen bör ha en tabell som du kan skapa, enligt följande:
CREATE TABLE emp4 (NAME char(30), AGE int, BIRTHDAY datetime, Memo1 text)
// SQLPutData.cpp
// compile with: odbc32.lib user32.lib
#include <stdio.h>
#include <windows.h>
#include <sqlext.h>
#include <odbcss.h>
#define TEXTSIZE 12000
#define MAXBUFLEN 256
SQLHENV henv = SQL_NULL_HENV;
SQLHDBC hdbc1 = SQL_NULL_HDBC;
SQLHSTMT hstmt1 = SQL_NULL_HSTMT;
void Cleanup() {
if (hstmt1 != SQL_NULL_HSTMT)
SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);
if (hdbc1 != SQL_NULL_HDBC) {
SQLDisconnect(hdbc1);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
}
if (henv != SQL_NULL_HENV)
SQLFreeHandle(SQL_HANDLE_ENV, henv);
}
int main() {
RETCODE retcode;
// SQLBindParameter variables.
SQLLEN cbTextSize, lbytes;
// SQLParamData variable.
PTR pParmID;
// SQLPutData variables.
UCHAR Data[] =
"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"
"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"
"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"
"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"
"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"
"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"
"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"
"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"
"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"
"abcdefghijklmnopqrstuvwxyz";
SDWORD cbBatch = (SDWORD)sizeof(Data) - 1;
// Allocate the ODBC environment and save handle.
retcode = SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv);
if ( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {
printf("SQLAllocHandle(Env) Failed\n\n");
Cleanup();
return(9);
}
// Notify ODBC that this is an ODBC 3.0 app.
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER);
if ( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {
printf("SQLSetEnvAttr(ODBC version) Failed\n\n");
Cleanup();
return(9);
}
// Allocate ODBC connection handle and connect.
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);
if ( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {
printf("SQLAllocHandle(hdbc1) Failed\n\n");
Cleanup();
return(9);
}
// Sample uses Integrated Security, create SQL Server DSN using Windows NT authentication.
retcode = SQLConnect(hdbc1, (UCHAR*)"Test", SQL_NTS, (UCHAR*)"",SQL_NTS, (UCHAR*)"", SQL_NTS);
if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
printf("SQLConnect() Failed\n\n");
Cleanup();
return(9);
}
// Allocate statement handle.
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);
if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
printf("SQLAllocHandle(hstmt1) Failed\n\n");
Cleanup();
return(9);
}
// Set parameters based on total data to send.
lbytes = (SDWORD)TEXTSIZE;
cbTextSize = SQL_LEN_DATA_AT_EXEC(lbytes);
// Bind the parameter marker.
retcode = SQLBindParameter (hstmt1, // hstmt
1, // ipar
SQL_PARAM_INPUT, // fParamType
SQL_C_CHAR, // fCType
SQL_LONGVARCHAR, // FSqlType
lbytes, // cbColDef
0, // ibScale
(VOID *)1, // rgbValue
0, // cbValueMax
&cbTextSize); // pcbValue
if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
printf("SQLBindParameter Failed\n\n");
Cleanup();
return(9);
}
// Execute the command.
retcode =
SQLExecDirect(hstmt1, (UCHAR*)"INSERT INTO emp4 VALUES('Paul Borm', 46,'1950-11-12 00:00:00', ?)", SQL_NTS);
if ( (retcode != SQL_SUCCESS) && (retcode != SQL_NEED_DATA) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
printf("SQLExecDirect Failed\n\n");
Cleanup();
return(9);
}
// Check to see if NEED_DATA; if yes, use SQLPutData.
retcode = SQLParamData(hstmt1, &pParmID);
if (retcode == SQL_NEED_DATA) {
while (lbytes > cbBatch) {
SQLPutData(hstmt1, Data, cbBatch);
lbytes -= cbBatch;
}
// Put final batch.
retcode = SQLPutData(hstmt1, Data, lbytes);
}
if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
printf("SQLParamData Failed\n\n");
Cleanup();
return(9);
}
// Make final SQLParamData call.
retcode = SQLParamData(hstmt1, &pParmID);
if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
printf("Final SQLParamData Failed\n\n");
Cleanup();
return(9);
}
// Clean up.
SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);
SQLDisconnect(hdbc1);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
}
Relaterade funktioner
| Mer information om | Se |
|---|---|
| Binda en buffert till en parameter | SQLBindParameter-funktionen |
| Avbryta instruktionsbearbetning | SQLCancel-funktion |
| Exekvering av en SQL-sats | SQLExecDirect-funktionen |
| Köra en förberedd SQL-instruktion | SQLExecute-funktion |
| Returnerar nästa parameter för att skicka data för | SQLParamData-funktion |