SQLBindParameter funkce

Soulad
Představená verze: ODBC 2.0 Shoda standardů: ODBC

Shrnutí
SQLBindParameter připojí buffer k parametru v SQL příkazu. SQLBindParameter podporuje vazbu na datový typ Unicode C, i když základní ovladač nepodporuje Unicode data.

Note

Tato funkce nahrazuje funkci ODBC 1.0 SQLSetParam. Pro více informací viz "Komentáře."

Syntax

  
SQLRETURN SQLBindParameter(  
      SQLHSTMT        StatementHandle,  
      SQLUSMALLINT    ParameterNumber,  
      SQLSMALLINT     InputOutputType,  
      SQLSMALLINT     ValueType,  
      SQLSMALLINT     ParameterType,  
      SQLULEN         ColumnSize,  
      SQLSMALLINT     DecimalDigits,  
      SQLPOINTER      ParameterValuePtr,  
      SQLLEN          BufferLength,  
      SQLLEN *        StrLen_or_IndPtr);  

Arguments

StatementHandle
[Vstup] Popisovač příkazu

ParameterNumber
[Vstup] Číslo parametru, seřazeno postupně v rostoucím pořadí parametrů, počínaje 1.

VstupníVýstupní typ
[Vstup] Typ parametru. Pro více informací viz "InputOutput Type Argument" v sekci "Komentáře."

ValueType
[Vstup] Datový typ parametru C. Pro více informací viz "ValueType Argument" v "Komentářích."

ParameterType
[Vstup] SQL datový typ parametru. Pro více informací viz "Argument typu parametru " v "Komentářích".

ColumnSize
[Vstup] Velikost sloupce nebo výraz příslušného parametrického markeru. Pro více informací viz "ColumnSize Argument" v sekci "Komentáře."

Pokud bude vaše aplikace běžet na 64bitovém operačním systému Windows, viz ODBC 64-Bit Information.

DecimalDigits
[Vstup] Desetinné číslice sloupce nebo výraz příslušného parametru. Pro více informací o velikosti sloupců viz Velikost sloupce, Desetinné číslice, Délka přenosového oktetu a Velikost displeje.

ParametrHodnotaPtr
[Odložený vstup] Ukazatel na buffer pro data parametru. Pro více informací viz "ParameterValuePtr Argument" v sekci "Komentáře."

BufferLength
[Vstup/výstup] Délka bufferu ParameterValuePtr v bajtech. Pro více informací viz "BufferLength Argument" v sekci "Komentáře."

Viz ODBC 64-Bit Information, pokud bude vaše aplikace běžet na 64bitovém operačním systému.

StrLen_or_IndPtr
[Odložený vstup] Ukazatel na buffer pro délku parametru. Pro více informací viz "StrLen_or_IndPtr Argument" v sekci "Komentáře."

Returns

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR nebo SQL_INVALID_HANDLE.

Diagnostics

Když SQLBindParameter vrátí SQL_ERROR nebo SQL_SUCCESS_WITH_INFO, lze získat přidruženou hodnotu SQLeState voláním SQLGetDiagRec s HandleType SQL_HANDLE_STMT a HandleStatementHandle. Následující tabulka uvádí hodnoty SQLSTATE, které SQLBindParameter obvykle vrací, a vysvětluje každou z nich v kontextu této funkce; notace "(DM)" předchází popisům SQLstavů vráceným Správcem ovladačů. Návratový kód přidružený ke každé hodnotě SQLSTATE je SQL_ERROR, pokud není uvedeno jinak.

SQLSTATE Error Description
01000 Obecné upozornění Informační zpráva specifická pro řidiče (Funkce vrátí SQL_SUCCESS_WITH_INFO.)
07006 Porušení atributu omezeného datového typu Datový typ identifikovaný argumentem ValueType nelze převést na datový typ identifikovaný argumentem ParameterType . Všimněte si, že tato chyba může být při vykonání vrácena SQLExecDirect, SQLExecute nebo SQLPutData , místo SQLBindParameter.
07009 Index neplatných deskriptorů (DM) Hodnota zadaná pro argument ParameterNumber byla menší než 1.
HY000 Obecná chyba Došlo k chybě, pro kterou nebyla definována žádná specifická funkce SQLSTATE a pro kterou nebyla definována žádná implementace sqlSTATE. Chybová zpráva vrácená SQLGetDiagRec v bufferu *MessageText popisuje chybu a její příčinu.
HY001 Chyba přidělení paměti Ovladač nemohl přidělit paměť, která je nutná k podpoře provádění nebo dokončování funkce.
HY003 Neplatný typ aplikačního bufferu Hodnota specifikovaná argumentem ValueType nebyla platným datovým typem C ani SQL_C_DEFAULT.
HY004 Neplatný typ SQL dat Hodnota určená pro argument ParameterType nebyla platným identifikátorem ODBC SQL datového typu ani specifickým identifikátorem SQL datového typu pro ovladač, který ovladač podporoval.
HY009 Hodnota neplatného argumentu (DM) Argument ParameterValuePtr byl nulový ukazatel, argument StrLen_or_IndPtr byl nulový ukazatel a argument InputOutputType nebyl SQL_PARAM_OUTPUT.

(DM) SQL_PARAM_OUTPUT, kde argument ParameterValuePtr byl nulový ukazatel, C typ byl char nebo binární a BufferLength (cbValueMax) byl větší než 0.
HY010 Chyba posloupnosti funkcí (DM) Byla volána asynchronně spuštěná funkce pro popisovač připojení, který je přidružen k StatementHandle. Tato asynchronní funkce se stále vykonávala, když byl vyvolán SQLBindParameter .

(DM) SQLExecute, SQLExecDirect nebo SQLMoreResults byl volána pro StatementHandle a vrácena SQL_PARAM_DATA_AVAILABLE. Tato funkce byla volána před načtením dat pro všechny streamované parametry.

(DM) Byla volána asynchronně vykonávající funkce pro CommandHandle a stále se spouštěla, když byla tato funkce vyvolána.

(DM) SQLExecute, SQLExecDirect, SQLBulkOperations nebo SQLSetPos byly volány pro StatementHandle a vráceny SQL_NEED_DATA. Tato funkce byla volána před odesláním dat pro všechny parametry provádění dat nebo sloupce.
HY013 Chyba správy paměti Volání funkce nelze zpracovat, protože základní objekty paměti nelze získat přístup, pravděpodobně kvůli nedostatku paměti.
HY021 Nekonzistentní informace o popisech Informace o popisu kontrolované během kontroly konzistence nebyly konzistentní. (Viz sekce "Kontroly konzistence" v SQLSetDescField.)

Hodnota určená pro argument DecimalDigits byla mimo rozsah hodnot podporovaných datovým zdrojem pro sloupec SQL datového typu specifikovaného argumentem ParameterType .
HY090 Neplatná délka řetězce nebo vyrovnávací paměti (DM) Hodnota v BufferLength byla menší než 0. (Viz popis pole SQL_DESC_DATA_PTR v SQLSetDescField.)
HY104 Neplatná přesnost nebo hodnota škály Hodnota zadaná pro argument ColumnSize nebo DecimalDigits byla mimo rozsah hodnot podporovaných datovým zdrojem pro sloupec SQL datového typu specifikovaného argumentem ParameterType .
HY105 Neplatný typ parametru (DM) Hodnota zadaná pro argument InputOutputType byla neplatná. (Viz "Komentáře.")
HY117 Připojení je pozastaveno kvůli neznámému stavu transakce. Jsou povoleny pouze funkce pro odpojení a jen pro čtení. (DM) Další informace o pozastaveném stavu naleznete v tématu FUNKCE SQLEndTran.
HYC00 Nepovinná funkce není implementována. Ovladač nebo zdroj dat nepodporuje převod specifikovaný kombinací hodnoty určené pro argument ValueType a hodnoty specifické pro ovladač pro argument ParameterType.

Hodnota určená pro argument ParameterType byla platným identifikátorem ODBC SQL datového typu pro verzi ODBC podporovanou ovladačem, ale nepodporována ovladačem ani zdrojem dat.

Ovladač podporuje pouze ODBC 2. x a argument ValueType byl jedním z následujících:

SQL_C_NUMERIC SQL_C_SBIGINT SQL_C_UBIGINT

a všechny intervalové C datové typy uvedené v C datových typech v příloze D: Datové typy.

Ovladač podporuje pouze verze ODBC před verzí 3.50 a argument ValueType byl SQL_C_GUID.
HYT01 Vypršel časový limit připojení Platnost časového limitu připojení vypršela, než zdroj dat odpověděl na žádost. Časový limit připojení je nastavený prostřednictvím sqlSetConnectAttr SQL_ATTR_CONNECTION_TIMEOUT.
IM001 Ovladač tuto funkci nepodporuje. (DM) Ovladač přidružený k StatementHandle nepodporuje funkci.

Comments

Aplikace volá SQLBindParameter pro přiřazení každého parametru v SQL příkazu. Vazby zůstávají v platnosti, dokud aplikace znovu nezavolá SQLBindParameter , nezavolá SQLFreeStmt s možností SQL_RESET_PARAMS, nebo nezavolá SQLSetDescField a nenastaví pole SQL_DESC_COUNT hlavičky APD na 0.

Další informace o parametrech naleznete v tématu Parametry příkazu. Pro více informací o typech parametrů a značkách parametrů viz Parametry datové typy a parametry v příloze C: SQL gramatika.

ParameterNumber Argument

Pokud je ParameterNumber ve volání SQLBindParameter větší než hodnota SQL_DESC_COUNT, SQLSetDescField se volá, aby se hodnota SQL_DESC_COUNT zvýšila na ParameterNumber.

Argument typu vstupu

Argument InputOutputType specifikuje typ parametru. Tento argument stanovuje SQL_DESC_PARAMETER_TYPE pole IPD. Všechny parametry v SQL příkazech, které nevolají procedury, jako INSERT jsou příkazy, jsou vstupnímiparametry. Parametry ve volání procedur můžou být vstupní, vstupní/výstupní nebo výstupní parametry. (Aplikace volá SQLProcedureColumns k určení typu parametru v procedurálním volání; parametry, jejichž typ nelze určit, se předpokládají jako vstupní parametry.)

Argument InputOutputType je jednou z následujících hodnot:

  • SQL_PARAM_INPUT. Parametr označuje parametr v SQL příkazu, který nevolá proceduru, například INSERT příkaz, ani neoznačuje vstupní parametr v procedurě. Například parametry v INSERT INTO Employee VALUES (?, ?, ?) jsou vstupní parametry, zatímco parametry v {call AddEmp(?, ?, ?)} mohou být, ale nemusí to nutně být, vstupními parametry.

    Když je příkaz vykonán, ovladač odešle data pro parametr do datového zdroje; buffer *ParametrValuePtr musí obsahovat platnou vstupní hodnotu, nebo buffer *StrLen_or_IndPtr musí obsahovat SQL_NULL_DATA, SQL_DATA_AT_EXEC nebo výsledek makra SQL_LEN_DATA_AT_EXEC.

    Pokud aplikace nemůže určit typ parametru v volání procedury, nastaví InputOutputType na SQL_PARAM_INPUT; pokud zdroj dat vrací hodnotu parametru, ovladač ji zahodí.

  • SQL_PARAM_INPUT_OUTPUT. Parametr označuje vstupní/výstupní parametr v postupu. Například parametr v {call GetEmpDept(?)} je vstupní/výstupní parametr, který přijímá jméno zaměstnance a vrací název jeho oddělení.

    Když je příkaz vykonán, ovladač odešle data pro parametr do datového zdroje; buffer *ParametrValuePtr musí obsahovat platnou vstupní hodnotu, nebo buffer *StrLen_or_IndPtr musí obsahovat SQL_NULL_DATA, SQL_DATA_AT_EXEC nebo výsledek makra SQL_LEN_DATA_AT_EXEC. Po vykonání příkazu ovladač vrací data pro parametr aplikaci; Pokud zdroj dat nevrátí hodnotu pro vstupní/výstupní parametr, ovladač nastaví buffer *StrLen_or_IndPtr na SQL_NULL_DATA.

    Note

    Když aplikace ODBC 1.0 zavolá SQLSetParam v ovladači ODBC 2.0, správce ovladačů to převede na volání SQLBindParameter , ve kterém je argument InputOutputType nastaven na SQL_PARAM_INPUT_OUTPUT.

  • SQL_PARAM_OUTPUT. Parametr označuje návratovou hodnotu procedury nebo výstupního parametru v procedurě; v obou případech se tyto parametry nazývají výstupní parametry. Například parametr v {?=call GetNextEmpID} je výstupní parametr, který vrací další ID zaměstnance.

    Po vykonání příkazu ovladač vrací data pro parametr aplikaci, pokud nejsou oba argumenty ParameterValuePtr a StrLen_or_IndPtr nulovými ukazateli, v takovém případě ovladač výstupní hodnotu zahodí. Pokud zdroj dat nevrátí hodnotu výstupního parametru, ovladač nastaví buffer *StrLen_or_IndPtr na SQL_NULL_DATA.

  • SQL_PARAM_INPUT_OUTPUT_STREAM. Označuje, že vstupní/výstupní parametr by měl být streamován. SQLGetData dokáže číst hodnoty parametrů v částech. Délka bufferu je ignorována, protože délka bufferu bude určena při volání SQLGetData. Hodnota StrLen_or_IndPtr bufferu musí obsahovat SQL_NULL_DATA, SQL_DEFAULT_PARAM, SQL_DATA_AT_EXEC nebo výsledek SQL_LEN_DATA_AT_EXEC makra. Parametr musí být na vstupu vázán jako parametr datový při vykonávání (DAE), pokud bude streamován na výstupu. ParameterValuePtr může být jakákoli nenulová hodnota ukazatele, kterou SQLParamData vrátí jako uživatelsky definovaný token, jehož hodnota byla předána pomocí ParameterValuePtr jak pro vstup, tak pro výstup. Další informace naleznete v tématu Načítání výstupních parametrů pomocí SQLGetData.

  • SQL_PARAM_OUTPUT_STREAM. Stejné jako SQL_PARAM_INPUT_OUTPUT_STREAM, ale pro výstupní parametr. * StrLen_or_IndPtr je při vstupu ignorován.

Následující tabulka uvádí různé kombinace InputOutputType a *StrLen_or_IndPtr:

VstupníVýstupní typ * Strlen_or_indptr Výsledek Poznámka k ParameterValuePtr
SQL_PARAM_INPUT SQL_LEN_DATA_AT_EXEC(len) nebo SQL_DATA_AT_EXEC Vstup v částech ParameterValuePtr může být jakákoli hodnota ukazatele, kterou SQLParamData vrátí jako uživatelsky definovaný token, jehož hodnota byla předána pomocí ParameterValuePtr.
SQL_PARAM_INPUT Ne SQL_LEN_DATA_AT_EXEC(len) nebo SQL_DATA_AT_EXEC Buffer omezený vstupem ParameterValuePtr je adresa vstupního bufferu.
SQL_PARAM_OUTPUT Ignorováno při vstupu. Výstupní omezený buffer ParametrHodnotaPtr je adresa výstupního bufferu.
SQL_PARAM_OUTPUT_STREAM Ignorováno při vstupu. Streamovaný výstup ParameterValuePtr může být libovolná hodnota ukazatele, kterou SQLParamData vrátí jako uživatelsky definovaný token, jehož hodnota byla předána pomocí ParameterValuePtr.
SQL_PARAM_INPUT_OUTPUT SQL_LEN_DATA_AT_EXEC(len) nebo SQL_DATA_AT_EXEC Vstup v dílech a výstupní omezený buffer ParameterValuePtr je adresa výstupního bufferu, který SQLParamData také vrací jako uživatelsky definovaný token, jehož hodnota byla předávána pomocí ParameterValuePtr.
SQL_PARAM_INPUT_OUTPUT Ne SQL_LEN_DATA_AT_EXEC(len) nebo SQL_DATA_AT_EXEC Vstupní omezený buffer a výstupní omezený buffer ParameterValuePtr je adresa sdíleného vstupního/výstupního bufferu.
SQL_PARAM_INPUT_OUTPUT_STREAM SQL_LEN_DATA_AT_EXEC(len) nebo SQL_DATA_AT_EXEC Vstup v dílech a streamovaný výstup ParameterValuePtr může být jakákoli ne-nulová hodnota ukazatele, kterou SQLParamData vrátí jako uživatelsky definovaný token, jehož hodnota byla předána pomocí ParameterValuePtr jak pro vstup, tak pro výstup.

Note

Ovladač musí rozhodnout, které SQL typy jsou povoleny, když aplikace svazuje výstupní nebo vstupně-výstupní parametr jako streamovaný. Správce ovladačů negeneruje chybu pro neplatný SQL typ.

ValueType Argument

Argument ValueType specifikuje C datový typ parametru. Tento argument stanovuje pole SQL_DESC_TYPE, SQL_DESC_CONCISE_TYPE a SQL_DESC_DATETIME_INTERVAL_CODE APD. To musí být jedna z hodnot v sekci C datových typů v příloze D: Datové typy.

Pokud je argument ValueType jedním z intervalových datových typů, pole SQL_DESC_TYPE záznamu ParameterNumber APD je nastaveno na SQL_INTERVAL, pole SQL_DESC_CONCISE_TYPE APD na typ dat concise interval a pole SQL_DESC_DATETIME_INTERVAL_CODE záznamu ParameterNumber je nastaveno na podkód pro konkrétní typ intervalových dat. ( Viz příloha D: Datové typy.) Výchozí přesnost předního intervalu (2) a výchozí přesnost intervalových sekund (6), jak jsou nastaveny v poli SQL_DESC_DATETIME_INTERVAL_PRECISION a SQL_DESC_PRECISION APD, jsou použity pro data. Pokud není vhodná výchozí přesnost, aplikace by měla explicitně nastavit pole deskriptoru voláním SQLSetDescField nebo SQLSetDescRec.

Pokud je argument ValueType jedním z datových typů datetime, pole SQL_DESC_TYPE záznamu ParameterNumber v APD je nastaveno na SQL_DATETIME, pole SQL_DESC_CONCISE_TYPE záznamu ParameterNumber v APD je nastaveno na stručný datový typ v datetime C a pole SQL_DESC_DATETIME_INTERVAL_CODE záznamu ParameterNumber je nastaveno na podkód pro konkrétní datový typ datetime. ( Viz příloha D: Datové typy.)

Pokud je argument ValueType datovým typem SQL_C_NUMERIC, použijí se výchozí přesnost (definovaná ovladačem) a výchozí škála (0), jak je nastavena v polích SQL_DESC_PRECISION a SQL_DESC_SCALE APD. Pokud výchozí přesnost nebo škálování není vhodné, aplikace by měla explicitně nastavit deskriptorové pole voláním na SQLSetDescField nebo SQLSetDescRec.

SQL_C_DEFAULT specifikuje, že hodnota parametru musí být přenesena z výchozího datového typu C pro SQL datový typ specifikovaný pomocí ParameterType.

Můžete také zadat rozšířený typ dat v C. Další informace naleznete v tématu Datové typy jazyka C v rozhraní ODBC.

Pro více informací viz Výchozí C datové typy, Převod dat z C do SQL datových typů a Převod dat ze SQL do C datových typů v příloze D: Datové typy.

Argument typu parametru

Musí to být jedna z hodnot uvedených v sekci SQL datové typy v příloze D: Datové typy, nebo musí být hodnota specifická pro ovladač. Tento argument stanovuje pole SQL_DESC_TYPE, SQL_DESC_CONCISE_TYPE a SQL_DESC_DATETIME_INTERVAL_CODE IPD.

Pokud je argument ParameterType jedním z identifikátorů datetime, pole SQL_DESC_TYPE IPD je nastaveno na SQL_DATETIME, pole SQL_DESC_CONCISE_TYPE IPD na stručný datový typ data day SQL a pole SQL_DESC_DATETIME_INTERVAL_CODE je nastaveno na příslušnou hodnotu datetime podkódu.

Pokud je ParameterType jedním z identifikátorů intervalů, pole SQL_DESC_TYPE IPD je nastaveno na SQL_INTERVAL, pole SQL_DESC_CONCISE_TYPE IPD na stručný SQL intervalový typ a pole SQL_DESC_DATETIME_INTERVAL_CODE IPD na příslušný intervalový podkód. SQL_DESC_DATETIME_INTERVAL_PRECISION pole IPD je nastaveno na přesnost vedoucí intervalu a pole SQL_DESC_PRECISION je nastaveno na přesnost interval sekund, pokud je to relevantní. Pokud výchozí hodnota SQL_DESC_DATETIME_INTERVAL_PRECISION nebo SQL_DESC_PRECISION není vhodná, aplikace by ji měla explicitně nastavit voláním SQLSetDescField. Pro více informací o těchto oblastech viz SQLSetDescField.

Pokud je argument ValueType datovým typem SQL_NUMERIC, pro data se použije výchozí přesnost (definovaná ovladačem) a výchozí škála (0), jak je nastavena v poli SQL_DESC_PRECISION a SQL_DESC_SCALE IPD. Pokud výchozí přesnost nebo škálování není vhodné, aplikace by měla explicitně nastavit deskriptorové pole voláním na SQLSetDescField nebo SQLSetDescRec.

Pro informace o tom, jak jsou data konvertována, viz Převod dat z C do SQL datových typů a Převod dat ze SQL do C datových typů v příloze D: Datové typy.

ColumnSize Argument

Argument ColumnSize určuje velikost sloupce nebo výrazu odpovídajícího parametru, délku daných dat, nebo obojí. Tento argument nastavuje různá pole IPD v závislosti na typu SQL dat (argument ParameterType ). Na toto zobrazení platí následující pravidla:

  • Pokud je ParameterType SQL_CHAR, SQL_VARCHAR, SQL_LONGVARCHAR, SQL_BINARY, SQL_VARBINARY, SQL_LONGVARBINARY nebo některý z stručných SQL datových typů datového času nebo intervalu, pole SQL_DESC_LENGTH IPD je nastaveno na hodnotu ColumnSize. (Pro více informací viz sekce Velikost sloupce, desetinné číslice, délka přenosového oktetu a velikost zobrazení v příloze D: Typy dat.)

  • Pokud je ParameterType SQL_DECIMAL, SQL_NUMERIC, SQL_FLOAT, SQL_REAL nebo SQL_DOUBLE, pole SQL_DESC_PRECISION IPD se nastaví na hodnotu ColumnSize.

  • U jiných datových typů se argument ColumnSize ignoruje.

Pro více informací viz "Passing Parameter Values" a SQL_DATA_AT_EXEC v "StrLen_or_IndPtr Argument."

DecimalDigits Argument

Pokud je ParameterType SQL_TYPE_TIME, SQL_TYPE_TIMESTAMP, SQL_INTERVAL_SECOND, SQL_INTERVAL_DAY_TO_SECOND, SQL_INTERVAL_HOUR_TO_SECOND nebo SQL_INTERVAL_MINUTE_TO_SECOND, pole SQL_DESC_PRECISION IPD je nastaveno na DecimalDigits. Pokud je ParameterType SQL_NUMERIC nebo SQL_DECIMAL, pole SQL_DESC_SCALE IPD je nastaveno na DecimalDigits. U všech ostatních datových typů se argument DecimalDigits ignoruje.

ParameterValuePtr Argument

Argument ParameterValuePtr ukazuje na buffer, který při volání SQLExecute nebo SQLExecDirect obsahuje skutečná data pro parametr. Data musí být ve formě specifikované argumentem ValueType . Tento argument stanovuje SQL_DESC_DATA_PTR pole APD. Aplikace může nastavit argument ParameterValuePtr na nulový ukazatel, pokud je *StrLen_or_IndPtr SQL_NULL_DATA nebo SQL_DATA_AT_EXEC. (Toto platí pouze pro vstupní nebo vstupní/výstupní parametry.)

Pokud je *StrLen_or_IndPtr výsledkem makra SQL_LEN_DATA_AT_EXEC(délka) nebo SQL_DATA_AT_EXEC, pak ParameterValuePtr je aplikací definovaná hodnota ukazatele, která je přiřazena k parametru. Je vrácen do aplikace prostřednictvím SQLParamData. Například ParameterValuePtr může být nenulový token, jako je číslo parametru, ukazatel na data nebo ukazatel na strukturu, kterou aplikace použila k přiřazení vstupních parametrů. Nicméně je třeba poznamenat, že pokud je parametr vstup/výstup, musí být ParameterValuePtr ukazatelem na buffer, kde bude uložena výstupní hodnota. Pokud je hodnota v atributu příkazu SQL_ATTR_PARAMSET_SIZE větší než 1, aplikace může použít hodnotu, na kterou odkazuje atribut SQL_ATTR_PARAMS_PROCESSED_PTR příkazu, spolu s argumentem ParameterValuePtr . Například ParameterValuePtr může ukazovat na pole hodnot a aplikace může použít hodnotu, na kterou SQL_ATTR_PARAMS_PROCESSED_PTR ukazuje, k získání správné hodnoty z pole. Pro více informací viz "Předávání parametrů" později v této části.

Pokud je argument InputOutputType SQL_PARAM_INPUT_OUTPUT nebo SQL_PARAM_OUTPUT, ParameterValuePtr ukazuje na buffer, do kterého ovladač vrací výstupní hodnotu. Pokud procedura vrátí jednu nebo více sad výsledků, buffer *ParameterValuePtr není zaručeno nastaven, dokud nejsou všechny množiny výsledků nebo počty řádků zpracovány. Pokud není buffer nastaven až do dokončení zpracování, výstupní parametry a návratové hodnoty nejsou dostupné, dokud SQLMoreResults nevrátí SQL_NO_DATA. Volání SQLCloseCursor nebo SQLFreeStmt s volbou SQL_CLOSE způsobí zamítnutí těchto hodnot.

Pokud je hodnota v atributu příkazu SQL_ATTR_PARAMSET_SIZE větší než 1, ParameterValuePtr ukazuje na pole. Jeden SQL příkaz zpracuje kompletní pole vstupních hodnot pro vstupní nebo vstupní/výstupní parametr a vrátí pole výstupních hodnot pro vstupní/výstupní nebo výstupní parametr.

BufferLength Argument

Pro znaková a binární C data argument BufferLength specifikuje délku bufferu *ParameterValuePtr (pokud je to jeden prvek) nebo délku prvku v poli *ParameterValuePtr (pokud je hodnota v atributu SQL_ATTR_PARAMSET_SIZE příkazu větší než 1). Tento argument stanovuje pole SQL_DESC_OCTET_LENGTH rekordu APD. Pokud aplikace specifikuje více hodnot, používá se BufferLength k určení umístění hodnot v poli *ParameterValuePtr , jak na vstupu, tak na výstupu. Pro vstupní/výstupní a výstupní parametry se používá k určení, zda na výstupu zkrátit znaková a binární C data:

  • Pro data znaku C, pokud je počet bajtů dostupných k vrácení větší nebo roven BufferLength, data v *ParametruHodnotyPtr jsou zkrácena na BufferLength minus délka znaku null-termination a jsou ukončena null-terminem ovladačem.

  • Pro binární C data, pokud je počet bajtů dostupných k vrácení větší než BufferLength, data v *ParametruHodnotyPtr jsou zkrácena na bajty BufferLength .

U všech ostatních typů C dat se argument BufferLength ignoruje. Délka bufferu *ParameterValuePtr (pokud jde o jeden prvek) nebo délka prvku v poli *ParameterValuePtr (pokud aplikace volá SQLSetStmtAttr s argumentem Attribute SQL_ATTR_PARAMSET_SIZE pro zadání více hodnot pro každý parametr) se předpokládá jako délka datového typu C.

Pro streamovaný výstup nebo streamované parametry vstupu/výstupu je argument BufferLength ignorován, protože délka bufferu je specifikována v SQLGetData.

Note

Když aplikace ODBC 1.0 volá SQLSetParam v ODBC 3. x driver, Driver Manager to převede na volání SQLBindParameter , kde je argument BufferLength vždy SQL_SETPARAM_VALUE_MAX. Protože správce ovladačů vrací chybu, pokud je ODBC 3. x aplikace nastaví BufferLength na SQL_SETPARAM_VALUE_MAX, tedy ODBC 3. x ovladač může použít tento ovladač k určení, kdy je volán aplikací ODBC 1.0.

Note

V SQLSetParam je způsob, jakým aplikace specifikuje délku bufferu *ParametrValuePtr , aby ovladač mohl vracet znaková nebo binární data, a způsob, jakým aplikace odesílá pole znaků nebo binárních parametrů ovladači, definován ovladačem.

StrLen_or_IndPtr Argument

Argument StrLen_or_IndPtr ukazuje na buffer, který při volání SQLExecute nebo SQLExecDirect obsahuje jeden z následujících. (Tento argument nastavuje pole SQL_DESC_OCTET_LENGTH_PTR a SQL_DESC_INDICATOR_PTR záznamů ukazatelů aplikačních parametrů.)

  • Délka hodnoty parametru uložené v *ParametruHodnotaPtr. To je ignorováno kromě znakových nebo binárních C dat.

  • SQL_NTS. Hodnota parametru je řetězec ukončený nulovým úsekem.

  • SQL_NULL_DATA. Hodnota parametru je NULL.

  • SQL_DEFAULT_PARAM. Procedurou je použít výchozí hodnotu parametru místo hodnoty získané z aplikace. Tato hodnota je platná pouze v procedurě zvané v kanonické syntaxi ODBC, a to pouze tehdy, pokud je argument InputOutputType SQL_PARAM_INPUT, SQL_PARAM_INPUT_OUTPUT nebo SQL_PARAM_INPUT_OUTPUT_STREAM. Když je *StrLen_or_IndPtr SQL_DEFAULT_PARAM, argumenty ValueType, ParameterType, ColumnSize, DecimalDigits, BufferLength a ParameterValuePtr jsou pro vstupní parametry ignorovány a používají se pouze k definování hodnoty výstupního parametru pro vstupní/výstupní parametry.

  • Výsledek makra SQL_LEN_DATA_AT_EXEC(délka). Data pro parametr budou odeslána pomocí SQLPutData. Pokud je argument ParameterType SQL_LONGVARBINARY, SQL_LONGVARCHAR nebo dlouhý, datově specifický datový typ a ovladač vrací "Y" pro SQL_NEED_LONG_DATA_LEN informační typ v SQLGetInfo, délka je počet bajtů dat, které mají být odesílány pro parametr; jinak musí být délka nezáporná a je ignorována. Pro více informací viz "Passing Parameter Values" později v této sekci.

    Například pro specifikaci, že 10 000 bajtů dat bude odesláno s SQLPutData v jednom nebo více voláních, pro parametr SQL_LONGVARCHAR aplikace nastaví *StrLen_or_IndPtr na SQL_LEN_DATA_AT_EXEC(10000).

  • SQL_DATA_AT_EXEC. Data pro parametr budou odeslána pomocí SQLPutData. Tato hodnota je používána aplikacemi ODBC 1.0 při volání ODBC 3. X ovladačů. Pro více informací viz "Passing Parameter Values" později v této sekci.

Pokud je StrLen_or_IndPtr nulový ukazatel, ovladač předpokládá, že všechny hodnoty vstupních parametrů nejsou NULL a že znaková a binární data jsou nulově ukončena. Pokud je InputOutputType SQL_PARAM_OUTPUT nebo SQL_PARAM_OUTPUT_STREAM a ParameterValuePtr a StrLen_or_IndPtr jsou nulové ukazatele, ovladač výstupní hodnotu zahodí.

Note

Vývojáři aplikací jsou důrazně odrazováni od specifikování nulového ukazatele pro StrLen_or_IndPtr , pokud je datový typ parametru SQL_C_BINARY. Aby se zajistilo, že ovladač nenečekaně nezkrátí SQL_C_BINARY data, měl by StrLen_or_IndPtr obsahovat ukazatel na platnou hodnotu délky.

Pokud je argument InputOutputType SQL_PARAM_INPUT_OUTPUT, SQL_PARAM_OUTPUT, SQL_PARAM_INPUT_OUTPUT_STREAM nebo SQL_PARAM_OUTPUT_STREAM, StrLen_or_IndPtr ukazuje na buffer, do kterého ovladač vrací SQL_NULL_DATA, počet bajtů dostupných k vrácení v *ParametruHodnotuPtr (bez nulového ukončení bajtu znakových dat), nebo SQL_NO_TOTAL (pokud nelze určit počet bajtů dostupných k vrácení). Pokud procedura vrátí jednu nebo více sad výsledků, *StrLen_or_IndPtr buffer není zaručeno nastaven, dokud nejsou všechny výsledky načteny.

Pokud je hodnota v atributu příkazu SQL_ATTR_PARAMSET_SIZE větší než 1, StrLen_or_IndPtr ukazuje na pole hodnot SQLLEN. Tyto hodnoty mohou být kteroukoliv z výše uvedených v této sekci a jsou zpracovávány jediným SQL příkazem.

Hodnoty parametrů předávání

Aplikace může předat hodnotu parametru buď do bufferu *ParameterValuePtr , nebo jedním či více voláními do SQLPutData. Parametry, jejichž data jsou předávána pomocí SQLPutData , jsou známé jako parametry dat-at-exekuce . Tyto se obvykle používají k odesílání dat pro SQL_LONGVARBINARY a SQL_LONGVARCHAR parametry a mohou být kombinovány s jinými parametry.

Pro předání hodnot parametrů aplikace provede následující sekvenci kroků:

  1. Volá SQLBindParameter pro každý parametr, aby navázal buffery pro hodnotu parametru (argument ParameterValuePtr ) a délku/indikátor (StrLen_or_IndPtr argument). Pro parametry dat při vykonání je ParameterValuePtr aplikací definovaná hodnota ukazatele, například číslo parametru nebo ukazatel na data. Hodnota bude vrácena později a lze ji použít k identifikaci parametru.

  2. Umisťuje hodnoty vstupních a vstupních/výstupních parametrů do bufferů *ParametrValuePtr a *StrLen_or_IndPtr :

    • Pro normální parametry aplikace umístí hodnotu parametru do bufferu *ParametrValuePtr a délku této hodnoty do bufferu *StrLen_or_IndPtr . Pro více informací viz Nastavení hodnot parametrů.

    • Pro parametry dat při vykonání aplikace umístí výsledek makra SQL_LEN_DATA_AT_EXEC(délka) (při volání ovladače ODBC 2.0) do bufferu *StrLen_or_IndPtr .

  3. Volá SQLExecute nebo SQLExecDirect pro spuštění SQL příkazu.

    • Pokud nejsou k dispozici parametry dat při vykonání, proces je dokončen.

    • Pokud jsou při vykonávání nějaká data parametry, funkce vrátí SQL_NEED_DATA.

  4. Volá SQLParamData k získání hodnoty definované aplikací specifikované v argumentu ParameterValuePtr v SQLBindParameter pro první parametr dat při vykonání, který má být zpracován. SQLParamData vrací SQL_NEED_DATA.

    Note

    Ačkoliv parametry dat při vykonání připomínají sloupce dat při vykonání, hodnota vrácená SQLParamData je pro každý z nich jiná. Parametry Data při vykonání jsou parametry v SQL příkazu, pro které budou data odeslána spolu se SQLPutData , když je příkaz vykonán pomocí SQLExecDirect nebo SQLExecute. Jsou vázány pomocí SQLBindParametru. Hodnota vrácená SQLParamData je ukazatel předaný SQLBindParameter v argumentu ParameterValuePtr . Sloupce Data-at-execution jsou sloupce v sadě řádků, pro které budou data odeslána spolu se SQLPutData , když je řádek aktualizován nebo přidán pomocí SQLBulkOperations , případně aktualizován pomocí SQLSetPos. Jsou vázáni na SQLBindCol. Hodnota vrácená SQLParamData je adresa řádku v bufferu *TargetValuePtr (nastaveném voláním SQLBindCol), který je zpracováván.

  5. Volá SQLPutData jednou nebo vícekrát, aby poslal data pro parametr. Pokud je hodnota dat větší než buffer *ParameterValuePtr specifikovaný v SQLPutData, je potřeba více než jedno volání; více volání do SQLPutData pro stejný parametr je povoleno pouze při odesílání dat znaku C do sloupce s typem znaku, binárního souboru nebo datového zdroje specifického, nebo při odeslání binárních C dat do sloupce s datovým typem se znakem, binárním nebo datovým typem specifickým pro zdroj dat.

  6. Znovu volá SQLParamData , aby signalizovala, že všechna data byla odeslána pro parametr.

    • Pokud je více parametrů dat při vykonání, SQLParamData vrátí SQL_NEED_DATA a hodnotu definovanou aplikací pro další parametr data při vykonání, který má být zpracován. Aplikace opakuje kroky 4 a 5.

    • Pokud již nejsou žádné další parametry dat při vykonání, proces je dokončen. Pokud byl příkaz úspěšně vykonán, SQLParamData vrací SQL_SUCCESS nebo SQL_SUCCESS_WITH_INFO; pokud provedení selže, vrátí SQL_ERROR. V tomto bodě může SQLParamData vrátit jakýkoli SQLSTATE, který může vrátit funkce používaná k vykonání příkazu (SQLExecDirect nebo SQLExecute).

      Výstupní hodnoty pro libovolné vstupní/výstupní nebo výstupní parametry jsou dostupné v bufferech *ParameterValuePtr a *StrLen_or_IndPtr poté, co aplikace získá všechny sady výsledků generované tímto příkazem.

Voláním SQLExecute nebo SQLExecDirect se příkaz umístí do SQL_NEED_DATA stavu. V tuto chvíli může aplikace volat pouze SQLCancel, SQLGetDiagField, SQLGetDiagRec, SQLGetFunctions, SQLParamData nebo SQLPutData s příkazem nebo connection handle spojeným s tímto příkazem. Pokud zavolá jinou funkci s příkazem nebo spojením spojeným s tímto příkazem, funkce vrátí SQLSTATE HY010 (chyba sekvence funkce). Příkaz opustí stav SQL_NEED_DATA, když SQLParamData nebo SQLPutData vrátí chybu, SQLParamData vrátí SQL_SUCCESS nebo SQL_SUCCESS_WITH_INFO, nebo je příkaz zrušen.

Pokud aplikace volá SQLCancel , zatímco ovladač stále potřebuje data pro parametry dat-at-exekuce, ovladač zruší provádění příkazu; aplikace pak může znovu volat SQLExecute nebo SQLExecDirect .

Získávání parametrů streamovaného výstupu

Když aplikace nastaví InputOutputType na SQL_PARAM_INPUT_OUTPUT_STREAM nebo SQL_PARAM_OUTPUT_STREAM, musí být hodnota výstupního parametru získána jedním nebo více voláními SQLGetData. Když má ovladač hodnotu streamovaného výstupního parametru, kterou má aplikaci vrátit, vrátí SQL_PARAM_DATA_AVAILABLE jako odpověď na volání následujících funkcí: SQLMoreResults, SQLExecute a SQLExecDirect. Aplikace volá SQLParamData , aby určila, která hodnota parametru je dostupná.

Pro více informací o parametrech SQL_PARAM_DATA_AVAILABLE a streamovaných výstupních parametrech viz Získávání výstupních parametrů pomocí SQLGetData.

Použití polí parametrů

Když aplikace připraví příkaz s parametrovými značkami a předá pole parametrů, existují dva různé způsoby, jak to provést. Jedním ze způsobů je, že ovladač spoléhá na schopnosti zpracování pole na backendu, v takovém případě je celý příkaz s polem parametrů považován za jednu atomovou jednotku. Oracle je příkladem datového zdroje, který podporuje možnosti zpracování polí. Dalším způsobem, jak tuto funkci implementovat, je, že ovladač vygeneruje dávku SQL příkazů, jeden SQL příkaz pro každou sadu parametrů v parametrovém poli a spustí dávku. Pole parametrů nelze použít s příkazem UPDATE WHERE CURRENT OF .

Když je pole parametrů zpracováváno, mohou být k dispozici jednotlivé množiny výsledků/počty řádků (jeden pro každou sadu parametrů) nebo lze výsledné množiny/počty řádků sloučit do jedné. Možnost SQL_PARAM_ARRAY_ROW_COUNTS v SQLGetInfo ukazuje, zda je pro každou sadu parametrů (SQL_PARC_BATCH) k dispozici počet řádků, nebo zda je k dispozici pouze jeden počet řádků (SQL_PARC_NO_BATCH).

Možnost SQL_PARAM_ARRAY_SELECTS v SQLGetInfo ukazuje, zda je pro každou sadu parametrů (SQL_PAS_BATCH) dostupná výsledná sada, nebo zda je k dispozici pouze jedna sada výsledků (SQL_PAS_NO_BATCH). Pokud ovladač neumožňuje spustit příkaz generující množinu výsledků s polem parametrů, SQL_PARAM_ARRAY_SELECTS vrátí SQL_PAS_NO_SELECT.

Pro více informací viz SQLGetInfo Function.

Pro podporu polí parametrů je atribut SQL_ATTR_PARAMSET_SIZE příkazu nastaven tak, aby určoval počet hodnot pro každý parametr. Pokud je pole větší než 1, musí pole SQL_DESC_DATA_PTR, SQL_DESC_INDICATOR_PTR a SQL_DESC_OCTET_LENGTH_PTR APD směřovat na pole. Kardinálnost každého pole je rovna hodnotě SQL_ATTR_PARAMSET_SIZE.

Pole SQL_DESC_ROWS_PROCESSED_PTR APD ukazuje na buffer, který obsahuje počet zpracovaných parametrů, včetně chybových sad. Při zpracování každé sady parametrů ovladač ukládá novou hodnotu do bufferu. Pokud jde o nulový ukazatel, žádné číslo se nevrátí. Když jsou použita pole parametrů, hodnota ukazovaná SQL_DESC_ROWS_PROCESSED_PTR polem APD je vyplněna, i když SQL_ERROR vrací funkce nastavení. Pokud je SQL_NEED_DATA vráceno, hodnota ukazovaná SQL_DESC_ROWS_PROCESSED_PTR polem APD je nastavena na sadu parametrů, která se zpracovává.

Co nastává, když je pole parametrů omezeno a je vykonán UPDATE příkaz WHERE CURRENT OF je definováno ovladačem.

Column-Wise Vázání parametrů

Při vazbě po sloupcích aplikace přiřazuje ke každému parametru samostatná pole parametrů a délky/indikátorů.

Pro použití vazby po sloupcích aplikace nejprve nastaví atribut SQL_ATTR_PARAM_BIND_TYPE příkazu na SQL_PARAM_BIND_BY_COLUMN. (Toto je výchozí nastavení.) Pro omezení každého sloupce aplikace provádí následující kroky:

  1. Přiděluje pole parametrů buffer.

  2. Přiděluje pole bufferů délky/indikátorů.

    Note

    Pokud aplikace zapisuje přímo do deskriptorů při použití sloupcového vazby, lze použít samostatná pole pro délková a indikační data.

  3. Volá SQLBindParameter s následujícími argumenty:

    • ValueType je C typ jednoho prvku v poli parametrické buffer.

    • ParameterType je SQL typ parametru.

    • ParametrHodnotaPtr je adresa pole parametrické buffery.

    • BufferLength je velikost jednoho prvku v poli parametrů bufferu. Argument BufferLength je ignorován, pokud jsou data s pevnou délkou.

    • StrLen_or_IndPtr je adresa pole délky/indikátorů.

Pro více informací o tom, jak jsou tyto informace používány, viz "ParameterValuePtr Argument" v sekci "Komentáře" později v této části. Pro více informací o vázání parametrů po sloupcích viz Binding Arrays of Parameters.

Row-Wise Vázání parametrů

Při řádkovém bindingu aplikace definuje strukturu, která obsahuje parametrové a délkové/indikátorové buffery pro každý parametr, který má být omezen.

Pro použití vazby po řádcích aplikace provádí následující kroky:

  1. Definuje strukturu, která uchovává jednu sadu parametrů (včetně parametrů i bufferů délky/indikátorů) a přiděluje pole těchto struktur.

    Note

    Pokud aplikace zapisuje přímo do deskriptorů při použití řádkového přiřazení, lze použít samostatná pole pro délku a indikátorová data.

  2. Nastaví atribut SQL_ATTR_PARAM_BIND_TYPE na velikost struktury obsahující jednu sadu parametrů nebo na velikost instance bufferu, do kterého budou parametry vázány. Délka musí obsahovat prostor pro všechny boundové parametry a jakékoli vyplnění struktury nebo bufferu, aby bylo zajištěno, že když se adresa boundového parametru zvýší o zadanou délku, výsledek ukáže na začátek stejného parametru v dalším řádku. Když použijete operátor sizeof v ANSI C, toto chování je zaručené.

  3. Volá SQLBindParameter s následujícími argumenty pro každý parametr, který má být omezen:

    • ValueType je typ člena parametrické buffery, který má být vázán na sloupec.

    • ParameterType je SQL typ parametru.

    • ParametrHodnotaPtr je adresa člena parametrické buffery v prvním prvku pole.

    • BufferLength je velikost člena parametrické buffery.

    • StrLen_or_IndPtr je adresa člena délky/indikátoru, který má být vázán.

Pro více informací o tom, jak jsou tyto informace používány, viz "ParameterValuePtr Argument" později v této sekci. Pro více informací o řádkovém vázání parametrů viz Binding Arrays of Parameters.

Informace o chybě

Pokud ovladač neimplementuje parametrová pole jako dávky (SQL_PARAM_ARRAY_ROW_COUNTS možnost je rovna SQL_PARC_NO_BATCH), chybové situace jsou řešeny, jako by byl vykonán jeden příkaz. Pokud ovladač implementuje parametrová pole jako dávky, aplikace může použít pole SQL_DESC_ARRAY_STATUS_PTR hlavičky IPD k určení, který parametr SQL příkazu nebo který parametr v poli parametrů způsobil, že SQLExecDirect nebo SQLExecute vrátily chybu. Toto pole obsahuje informace o stavu pro každý řádek hodnot parametrů. Pokud pole indikuje, že došlo k chybě, pole v diagnostické datové struktuře uvedou řádek a číslo parametru parametru, který selhal. Počet prvků v poli bude definován polem SQL_DESC_ARRAY_SIZE hlavičky v APD, které lze nastavit atributem SQL_ATTR_PARAMSET_SIZE příkazu.

Note

Pole SQL_DESC_ARRAY_STATUS_PTR hlavičky v APD se používá k ignorování parametrů. Pro více informací o ignorování parametrů viz následující část "Ignorování sady parametrů."

Když SQLExecute nebo SQLExecDirect vrátí SQL_ERROR, prvky v poli, na které ukazuje SQL_DESC_ARRAY_STATUS_PTR pole v IPD, budou obsahovat SQL_PARAM_ERROR, SQL_PARAM_SUCCESS, SQL_PARAM_SUCCESS_WITH_INFO, SQL_PARAM_UNUSED nebo SQL_PARAM_DIAG_UNAVAILABLE.

Pro každý prvek v tomto poli obsahuje diagnostická datová struktura jeden nebo více stavových záznamů. Pole SQL_DIAG_ROW_NUMBER struktury označuje číslo řádku hodnot parametrů, které chybu způsobily. Pokud je možné určit konkrétní parametr v řadě parametrů, který způsobil chybu, číslo parametru se zadá do pole SQL_DIAG_COLUMN_NUMBER.

SQL_PARAM_UNUSED se zadává, když parametr nebyl použit, protože v dřívějším parametru došlo k chybě, která donutila SQLExecute nebo SQLExecDirect k přerušení. Například pokud je 50 parametrů a při vykonání čtyřicáté sady parametrů došlo k chybě, která způsobila přerušení SQLExecute nebo SQLExecDirect , pak se SQL_PARAM_UNUSED zadá do stavového pole pro parametry 41 až 50.

SQL_PARAM_DIAG_UNAVAILABLE se zadává, když ovladač považuje pole parametrů za monolitickou jednotku, takže negeneruje tuto individuální úroveň chybových informací parametrů.

Některé chyby při zpracování jedné sady parametrů způsobí zastavení zpracování následujících sad parametrů v poli. Ostatní chyby neovlivňují zpracování následných parametrů. Které chyby zastaví zpracování, je definováno ovladačem. Pokud zpracování není zastaveno, všechny parametry v poli jsou zpracovány SQL_SUCCESS_WITH_INFO se vrací jako výsledek chyby a buffer definovaný SQL_ATTR_PARAMS_PROCESSED_PTR je nastaven na celkový počet zpracovaných sad parametrů (jak je definováno atributem SQL_ATTR_PARAMSET_SIZE příkazu), což zahrnuje chybové sady.

Caution

Chování ODBC, když dojde k chybě při zpracování pole parametrů, je v ODBC 3 odlišné. x než v ODBC 2. x. V ODBC 2. x, funkce vrátila SQL_ERROR a zpracování skončilo. Buffer, na který odkazuje pirowův argument SQLParamOptions, obsahoval číslo chybového řádku. V ODBC 3. x, funkce vrací SQL_SUCCESS_WITH_INFO a zpracování může buď zastavit, nebo pokračovat. Pokud bude pokračovat, buffer specifikovaný SQL_ATTR_PARAMS_PROCESSED_PTR bude nastaven na hodnotu všech zpracovaných parametrů, včetně těch, které vedly k chybě. Tato změna chování může způsobit problémy pro stávající aplikace.

Když se SQLExecute nebo SQLExecDirect vrátí před dokončením zpracování všech sad parametrů v poli parametrů, například když je vráceno SQL_ERROR nebo SQL_NEED_DATA, stavové pole obsahuje stavy pro tyto parametry, které již byly zpracovány. Místo, na které ukazuje SQL_DESC_ROWS_PROCESSED_PTR pole v IPD, obsahuje číslo řádku v parametrovém poli, které způsobilo chybový kód SQL_ERROR nebo SQL_NEED_DATA. Když je pole parametrů odesláno do příkazu SELECT, dostupnost hodnot stavového pole je definována ovladačem; mohou být dostupné po vykonání příkazu nebo při načtení výsledků.

Ignorování sady parametrů

Pole SQL_DESC_ARRAY_STATUS_PTR v APD (nastavené atributem SQL_ATTR_PARAM_STATUS_PTR příkazu) lze použít k označení, že množina bounds parametrů v SQL příkazu by měla být ignorována. Aby aplikace mohla ovladač během spuštění ignorovat jednu nebo více sad parametrů, měla by postupovat podle těchto kroků:

  1. Zavolejte SQLSetDescField a nastavte pole SQL_DESC_ARRAY_STATUS_PTR hlavičky APD tak, aby ukazovalo na pole hodnot SQLUSMALLINT pro obsahování stavových informací. Toto pole lze také nastavit voláním SQLSetStmtAttr s atributem SQL_ATTR_PARAM_OPERATION_PTR, což umožňuje aplikaci nastavit pole bez získání popisovacího handle.

  2. Nastavte každý prvek pole definovaného SQL_DESC_ARRAY_STATUS_PTR polem APD na jednu ze dvou hodnot:

    • SQL_PARAM_IGNORE, aby bylo naznačeno, že řádek je vyloučen z provádění příkazu.

    • SQL_PARAM_PROCEED, aby bylo označeno, že řádek je zahrnut při provádění příkazu.

  3. Zavolejte SQLExecDirect nebo SQLExecute pro spuštění připraveného příkazu.

Následující pravidla platí pro pole definované SQL_DESC_ARRAY_STATUS_PTR polem APD:

  • Ukazatel je ve výchozím nastavení nastaven na null.

  • Pokud je ukazatel null, použijí se všechny sady parametrů, jako by všechny prvky byly nastaveny na SQL_ROW_PROCEED.

  • Nastavení prvku na SQL_PARAM_PROCEED nezaručuje, že operace použije danou sadu parametrů.

  • SQL_PARAM_PROCEED je v hlavičkovém souboru definováno jako 0.

Aplikace může nastavit, že pole SQL_DESC_ARRAY_STATUS_PTR v APD bude směřovat na stejné pole jako pole SQL_DESC_ARRAY_STATUS_PTR v IRD. To je užitečné při vázání parametrů na řádková data. Parametry lze pak ignorovat podle stavu dat v řádku. Kromě SQL_PARAM_IGNORE následující kódy způsobují, že parametr v SQL příkazu je ignorován: SQL_ROW_DELETED, SQL_ROW_UPDATED a SQL_ROW_ERROR. Kromě SQL_PARAM_PROCEED následující kódy způsobují postup SQL příkazu: SQL_ROW_SUCCESS, SQL_ROW_SUCCESS_WITH_INFO a SQL_ROW_ADDED.

Parametry převazování

Aplikace může provést jednu ze dvou operací ke změně vazby:

  • Zavolejte SQLBindParameter pro určení nového vazby pro sloupec, který je již vázaný. Ovladač přepíše starou vazbu novou.

  • Specifikujte offset, který má být přidán k adresě bufferu, která byla specifikována voláním vázání na SQLBindParameter. Pro více informací viz následující sekce "Převazování s posuny."

Převazování s offsety

Převazování parametrů je zvláště užitečné, když má aplikace nastavenou buffer oblast, která může obsahovat mnoho parametrů, ale volání SQLExecDirect nebo SQLExecute využívá jen několik parametrů. Zbývající prostor v bufferové oblasti lze využít pro další sadu parametrů úpravou stávajícího vazby o posunek.

Pole SQL_DESC_BIND_OFFSET_PTR hlavičky v APD ukazuje na posun vázání. Pokud je pole nenull, ovladač ukazatel dereferencuje a pokud žádná z hodnot v poli SQL_DESC_DATA_PTR, SQL_DESC_INDICATOR_PTR a SQL_DESC_OCTET_LENGTH_PTR není null, přidá dereferencovanou hodnotu do těchto polí v descriptorových záznamech při vykonání. Nové hodnoty ukazatele se používají při vykonání SQL příkazů. Offset zůstává platný i po převázání. Protože SQL_DESC_BIND_OFFSET_PTR je ukazatelem na offset, nikoli samotným offsetem, může aplikace offset změnit přímo, aniž by musela volat SQLSetDescField nebo SQLSetDescRec pro změnu descriptorového pole. Ukazatel je ve výchozím nastavení nastaven na null. SQL_DESC_BIND_OFFSET_PTR pole ARD lze nastavit voláním SQLSetDescField nebo voláním SQLSetStmtAttr s atributem SQL_ATTR_PARAM_BIND_OFFSET_PTR .

Vazební offset se vždy přidává přímo k hodnotám v polích SQL_DESC_DATA_PTR, SQL_DESC_INDICATOR_PTR a SQL_DESC_OCTET_LENGTH_PTR. Pokud je offset změněn na jinou hodnotu, nová hodnota se stále přidá přímo k hodnotě v každém descriptorovém poli. Nový posun se nepřičítá k součtu hodnoty pole a dřívějších posuvů.

Deskriptory

Jak je parametr omezen, určují pole APD a IPD. Argumenty v SQLBindParameter se používají k nastavení těchto descriptorových polí. Pole lze také nastavit pomocí funkcí SQLSetDescField , i když SQLBindParameter je efektivnější, protože aplikace nemusí získávat deskriptor pro volání SQLBindParameter.

Caution

Volání SQLBindParameter pro jeden příkaz může ovlivnit i jiné příkazy. K tomu dochází, když je ARD přiřazený k příkazu explicitně alokován a je také spojen s dalšími příkazy. Protože SQLBindParameter mění pole APD, úpravy se vztahují na všechny příkazy, s nimiž je tento deskriptor spojen. Pokud toto chování není požadované, měla by aplikace tento deskriptor oddělit od ostatních příkazů před zavoláním SQLBindParameter.

Konceptuálně SQLBindParameter provádí následující kroky v pořadí:

  1. Volá SQLGetStmtAttr pro získání APD handle.

  2. Volá SQLGetDescField , aby získal SQL_DESC_COUNT pole APD, a pokud hodnota argumentu ColumnNumber překročí hodnotu SQL_DESC_COUNT, zavolá SQLSetDescField , aby zvýšil hodnotu SQL_DESC_COUNT na ColumnNumber.

  3. Volá SQLSetDescField několikrát, aby přiřadil hodnoty následujícím polím APD:

    • Nastavuje SQL_DESC_TYPE a SQL_DESC_CONCISE_TYPE na hodnotu ValueType, s výjimkou toho, že pokud je ValueType jedním z stručných identifikátorů podtypu datetime nebo interval, nastaví SQL_DESC_TYPE na SQL_DATETIME nebo SQL_INTERVAL, SQL_DESC_CONCISE_TYPE na stručný identifikátor a SQL_DESC_DATETIME_INTERVAL_CODE na odpovídající podkód datetime nebo interval.

    • Nastaví pole SQL_DESC_OCTET_LENGTH na hodnotu BufferLength.

    • Nastaví pole SQL_DESC_DATA_PTR na hodnotu ParameterValue.

    • Nastaví pole SQL_DESC_OCTET_LENGTH_PTR na hodnotu StrLen_or_Ind.

    • Nastaví také pole SQL_DESC_INDICATOR_PTR na hodnotu StrLen_or_Ind.

    Parametr StrLen_or_Ind specifikuje jak informace o indikátoru, tak délku hodnoty parametru.

  4. Volá SQLGetStmtAttr pro získání IPD přezdívky.

  5. Volá SQLGetDescField pro získání SQL_DESC_COUNT pole IPD, a pokud hodnota argumentu ColumnNumber překročí hodnotu SQL_DESC_COUNT, zavolá SQLSetDescField a zvýší hodnotu SQL_DESC_COUNT na ColumnNumber.

  6. Volá SQLSetDescField několikrát, aby přiřadil hodnoty následujícím polím IPD:

    • Nastavuje SQL_DESC_TYPE a SQL_DESC_CONCISE_TYPE na hodnotu ParameterType, s výjimkou toho, že pokud je ParameterType jedním z stručných identifikátorů podtypu datetime nebo interval, nastaví SQL_DESC_TYPE na SQL_DATETIME nebo SQL_INTERVAL, SQL_DESC_CONCISE_TYPE nastaví na stručný identifikátor a SQL_DESC_DATETIME_INTERVAL_CODE na odpovídající datetime nebo intervalový podkód.

    • Nastaví jednu nebo více SQL_DESC_LENGTH, SQL_DESC_PRECISION a SQL_DESC_DATETIME_INTERVAL_PRECISION, podle potřeby pro ParameterType.

    • Nastavuje SQL_DESC_SCALE na hodnotu DecimalDigits.

Pokud volání SQLBindParameter selže, obsah descriptorových polí, která by nastavil v APD, zůstává nedefinovaný a pole SQL_DESC_COUNT APD zůstává nezměněno. Navíc pole SQL_DESC_LENGTH, SQL_DESC_PRECISION, SQL_DESC_SCALE a SQL_DESC_TYPE příslušného záznamu v IPD nejsou definována a pole SQL_DESC_COUNT IPD zůstává nezměněno.

Převod volání do a z SQLSetParam

Když aplikace ODBC 1.0 volá SQLSetParam v ODBC 3. x driver, ODBC 3. x Driver Manager mapuje volání, jak je znázorněno v následující tabulce.

Volání podle aplikace ODBC 1.0 Zavolejte na ODBC 3. X driver
SQLSetParam( PříkazHandle, ParameterNumber, ValueType, ParameterType, LengthPrecision, ParameterScale, ParameterValuePtr, StrLen_or_IndPtr); SQLBindParameter( PříkazHandle, ParameterNumber, SQL_PARAM_INPUT_OUTPUT, ValueType, ParameterType, ColumnSize, DecimalDigits, ParameterValuePtr, SQL_SETPARAM_VALUE_MAX, StrLen_or_IndPtr);

Examples

A. Použijte funkci SQLBindParameter

V následujícím příkladu aplikace připravuje SQL příkaz pro vložení dat do tabulky ORDERS. Pro každý parametr ve příkazu aplikace volá SQLBindParameter pro určení datového typu ODBC C a SQL datového typu parametru a pro navázání bufferu na každý parametr. Pro každý řádek dat aplikace přiřadí datové hodnoty ke každému parametru a zavolá SQLExecute pro vykonání příkazu.

Následující ukázka předpokládá, že máte na svém počítači zdroj dat ODBC jménem Northwind, který je spojen s databází Northwind.

Pro více příkladů kódu viz SQLBulkOperations Function, SQLProcedures Function, SQLPutData Function a SQLSetPos Function.

// SQLBindParameter_Function.cpp  
// compile with: ODBC32.lib  
#include <windows.h>  
#include <sqltypes.h>  
#include <sqlext.h>  
  
#define EMPLOYEE_ID_LEN 10  
  
SQLHENV henv = NULL;  
SQLHDBC hdbc = NULL;  
SQLRETURN retcode;  
SQLHSTMT hstmt = NULL;  
SQLSMALLINT sCustID;  
  
SQLCHAR szEmployeeID[EMPLOYEE_ID_LEN];  
SQL_DATE_STRUCT dsOrderDate;  
SQLINTEGER cbCustID = 0, cbOrderDate = 0, cbEmployeeID = SQL_NTS;  
  
int main() {  
   retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);  
   retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER*)SQL_OV_ODBC3, 0);   
  
   retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);   
   retcode = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0);  
  
   retcode = SQLConnect(hdbc, (SQLCHAR*) "Northwind", SQL_NTS, (SQLCHAR*) NULL, 0, NULL, 0);  
   retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);  
  
   retcode = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, EMPLOYEE_ID_LEN, 0, szEmployeeID, 0, &cbEmployeeID);  
   retcode = SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &sCustID, 0, &cbCustID);  
   retcode = SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_TYPE_DATE, SQL_TIMESTAMP, sizeof(dsOrderDate), 0, &dsOrderDate, 0, &cbOrderDate);  
  
   retcode = SQLPrepare(hstmt, (SQLCHAR*)"INSERT INTO Orders(CustomerID, EmployeeID, OrderDate) VALUES (?, ?, ?)", SQL_NTS);  
  
   strcpy_s((char*)szEmployeeID, _countof(szEmployeeID), "BERGS");  
   sCustID = 5;  
   dsOrderDate.year = 2006;  
   dsOrderDate.month = 3;  
   dsOrderDate.day = 17;  
  
   retcode = SQLExecute(hstmt);  
}  

B. Spustit uloženou proceduru pomocí pojmenovaného parametru

V následujícím příkladu aplikace vykoná uloženou proceduru SQL Server pomocí pojmenovaného parametru.

// SQLBindParameter_Function_2.cpp  
// compile with: ODBC32.lib  
// sample assumes the following stored procedure:  
// use northwind  
// DROP PROCEDURE SQLBindParameter  
// GO  
//   
// CREATE PROCEDURE SQLBindParameter @quote int  
// AS  
// delete from orders where OrderID >= @quote  
// GO  
#include <windows.h>  
#include <sqltypes.h>  
#include <sqlext.h>  
  
SQLHDESC hIpd = NULL;  
SQLHENV henv = NULL;  
SQLHDBC hdbc = NULL;  
SQLRETURN retcode;  
SQLHSTMT hstmt = NULL;  
SQLCHAR szQuote[50] = "100084";  
SQLINTEGER cbValue = SQL_NTS;  
  
int main() {  
   retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);  
   retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER*)SQL_OV_ODBC3, 0);   
  
   retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);   
   retcode = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0);  
  
   retcode = SQLConnect(hdbc, (SQLCHAR*) "Northwind", SQL_NTS, (SQLCHAR*) NULL, 0, NULL, 0);  
   retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);  
  
   retcode = SQLPrepare(hstmt, (SQLCHAR*)"{call SQLBindParameter(?)}", SQL_NTS);  
   retcode = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 50, 0, szQuote, 0, &cbValue);  
   retcode = SQLGetStmtAttr(hstmt, SQL_ATTR_IMP_PARAM_DESC, &hIpd, 0, 0);  
   retcode = SQLSetDescField(hIpd, 1, SQL_DESC_NAME, "@quote", SQL_NTS);  
  
   retcode = SQLExecute(hstmt);  
}  
Informace o Podívejte se
Vrácení informace o parametru ve výroku SQLDescribeParam Function
Provádění SQL příkazu SQLExecDirect Function
Spuštění připraveného příkazu SQL FUNKCE SQLExecute
Uvolnění parametrických bufferů na příkazu FUNKCE SQLFreeStmt
Vrácení počtu parametrů příkazu SQLNumParams Function
Vrácení dalšího parametru pro odesílání dat pro SQLParamData – funkce
Specifikace více hodnot parametrů Funkce SQLParamOptions
Odesílání dat parametrů v době provádění FUNKCE SQLPutData

Viz také

Referenční rozhraní ODBC API
Soubory hlaviček ODBC
Získávání výstupních parametrů pomocí SQLGetData