Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Megfelelőség
Bemutatott verzió: ODBC 2.0 Szabványoknak megfelelés: ODBC
Összefoglalás
Az SQLBindParameter egy puffert köt egy SQL utasításban található paraméterjelölőhöz.
Az SQLBindParameter támogatja a kötést egy Unicode C adattípushoz, még akkor is, ha az alapillesztő nem támogatja az Unicode adatokat.
Note
Ez a függvény helyettesíti az ODBC 1.0 SQLSetParam függvényt. További információért lásd: "Hozzászólások".
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
[Bemenet] Utasításkezelő.
Paraméterszám
[Bemenet] Paraméterszám, sorrendben, növekvő paramétersorrendben, 1-től kezdve.
InputOutputType
[Bemenet] A paraméter típusa. További információért lásd: "InputOutputType argument" a "Hozzászólások" részén.
ValueType
[Bemenet] A paraméter C adattípusa. További információért lásd a "ValueType argument" (ValueType argument) a "Hozzászólások" részben.
ParameterType
[Bemenet] A paraméter SQL adattípusa. További információért lásd a "ParameterType Argument" (ParameterType argument) a "Hozzászólások" részben.
ColumnSize
[Bemenet] Az oszlop mérete vagy a megfelelő paraméterjelző kifejezése. További információért lásd: "ColumnSize Argument" a "Hozzászólások" részben.
Ha az alkalmazásod 64 bites Windows operációs rendszeren fut, lásd az ODBC 64-bit információkat.
DecimDigits
[Bemenet] Az oszlop tizedes számjegyei vagy a megfelelő paraméterjelző kifejezése. További információért az oszlopméretről lásd: Oszlopméret, tizedes számjegyek, átviteli oktet hossz és megjelenítés mérete.
ParameterValuePtr
[Halasztott bemenet] Egy mutató egy pufferre a paraméter adataihoz. További információért lásd: "ParameterValuePtr érve" a "Hozzászólások" részben.
BufferLength
[Bemenet/kimenet] A ParameterValuePtr puffer hossza bájtokban. További információért lásd a "BufferLength Argument" (BufferLength Argument) a "Kommentek" részben.
Lásd : ODBC 64-bites információk, ha az alkalmazásod 64 bites operációs rendszeren fut-e.
StrLen_or_IndPtr
[Halasztott bemenet] Egy puffermutató a paraméter hosszára. További információért lásd: "StrLen_or_IndPtr Érv" a "Hozzászólások" részben.
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR vagy SQL_INVALID_HANDLE.
Diagnostics
Amikor az SQLBindParameter SQL_ERROR vagy SQL_SUCCESS_WITH_INFO értéket ad vissza, egy hozzárendelt SQLSTATE értéket lehet elérni, ha az SQLGetDiagRec hívása egy SQL_HANDLE_STMT HandleType és egy HandleType (StatementHandle) segítségével. Az alábbi táblázat felsorolja az SQLBindParameter által általában visszaadott SQLSTATE értékeket, és mindegyiket ennek a függvénynek a kontextusában magyarázza; a "(DM)" jelölés megelőzi a Driver Manager által visszaadott SQLSTATE-leírásokat. Az egyes SQLSTATE-értékekhez társított visszatérési kód SQL_ERROR, kivéve, ha másként van feltüntetve.
| SQLSTATE | Error | Description |
|---|---|---|
| 01000 | Általános figyelmeztetés | Illesztőprogram-specifikus tájékoztató üzenet. (A függvény SQL_SUCCESS_WITH_INFO ad vissza.) |
| 07006 | Korlátozott adattípus-attribútumok megsértése | A ValueType argumentum által azonosított adattípus nem konvertálható a ParameterType argumentum által azonosított adattípusra. Figyeljük meg, hogy ezt a hibát a SQLExecDirect, SQLExecute vagy SQLPutData is visszaadhatja végrehajtáskor, nem pedig az SQLBindParameter. |
| 07009 | Érvénytelen descriptor index | (DM) A ParameterNumber argument értéke kevesebb volt, mint 1. |
| HY000 | Általános hiba | Hiba történt, amely miatt nem volt konkrét SQLSTATE, és amelyhez nem definiáltak implementációspecifikus SQLSTATE-t. Az SQLGetDiagRec által a *MessageText pufferben visszaadott hibaüzenet leírja a hibát és annak okát. |
| HY001 | Memóriafoglalási hiba | Az illesztőprogram nem tudta lefoglalni a függvény végrehajtásának vagy befejezésének támogatásához szükséges memóriát. |
| HY003 | Érvénytelen alkalmazáspuffer típus | A ValueType argumentus által megadott érték nem volt érvényes C adattípus vagy SQL_C_DEFAULT. |
| HY004 | Invalid SQL adattípus | A ParameterType argument értéke sem érvényes ODBC SQL adattípus-azonosító, sem az illesztőprogram által támogatott illezőgép-specifikus SQL adattípus-azonosító nem volt. |
| HY009 | Érvénytelen argumentumérték | (DM) A ParameterValuePtr érve null mutató volt, az érve StrLen_or_IndPtr null mutató, az InputOutputType érve pedig nem volt SQL_PARAM_OUTPUT. (DM) SQL_PARAM_OUTPUT, ahol a ParameterValuePtr érve null mutató volt, a C típus karakter vagy bináris volt, és a BufferLength (cbValueMax) nagyobb volt 0-nál. |
| HY010 | Függvényütemezési hiba | (DM) A StatementHandle-hez társított kapcsolati leíróhoz aszinkron módon végrehajtó függvény lett meghívva. Ez az aszinkron függvény még akkor futott, amikor az SQLBindParameter hívása volt. (DM) SQLExecute, SQLExecDirect vagy SQLMoreResults lett meghívva az Utasításkezelőhöz , és SQL_PARAM_DATA_AVAILABLE ad vissza. Ez a függvény az összes streamelt paraméter adatainak lekérése előtt lett meghívva. (DM) Egy aszinkron futó függvényt hívtak a StatementHandle számára, és még akkor futott, amikor ezt a függvényt hívták. (DM) SQLExecute, SQLExecDirect, SQLBulkOperations vagy SQLSetPos lett meghívva az Utasításkezelőhöz , és SQL_NEED_DATA. Ezt a függvényt az összes adatvégrehajtási paraméter vagy oszlop adatküldése előtt hívták meg. |
| HY013 | Memóriakezelési hiba | A függvényhívás nem dolgozható fel, mert a mögöttes memóriaobjektumok nem érhetők el, esetleg a memóriahiány miatt. |
| HY021 | Következetlen leíró információk | A konzisztencia-ellenőrzés során ellenőrizett leíró információk nem voltak következetesek. (Lásd az SQLSetDescField "Konzisztencia ellenőrzések" szekcióját.) A DecimalDigits argumentumhoz megadott érték kívül esett azon az értéktartományon, amelyet az adatforrás támogat az SQL adattípus oszlopára, amelyet a ParameterType argumentum jelölt. |
| HY090 | Érvénytelen sztring vagy puffer hossza | (DM) A BufferLength értéke kevesebb volt, mint 0. (Lásd az SQL_DESC_DATA_PTR mező leírását az SQLSetDescField adatbázisban.) |
| HY104 | Érvénytelen pontosság vagy skála érték | A ColumnSize vagy DecimalDigits argumentumhoz megadott érték kívül esett az adatforrás által támogatott értéktartományon, amelyet a ParameterType argumentum által megadott SQL adattípus oszlopa támogat. |
| HY105 | Érvénytelen paramétertípus | (DM) Az InputOutputType argumentumhoz megadott érték érvénytelen volt. (Lásd: "Hozzászólások.") |
| HY117 | A kapcsolat ismeretlen tranzakciós állapot miatt fel van függesztve. Csak a leválasztási és írásvédett függvények engedélyezettek. | (DM) A felfüggesztett állapotról további információt az SQLEndTran függvényben talál. |
| HYC00 | A választható funkció nem implementálva | Az illesztőprogram vagy adatforrás nem támogatja azt az átalakítást, amelyet a ValueType argumentushoz megadott érték és a ParameterType argumentumhoz megadott driver-specifikus érték kombinációjával jelöltek meg. A ParameterType argument értéke érvényes ODBC SQL adattípus azonosítója volt az illesztőprogram által támogatott ODBC verzióra, de az illesztőprogram vagy az adatforrás nem támogatta. A meghajtó csak az ODBC 2-t támogatja. x és az érv ValueType az alábbiak egyike volt: SQL_C_NUMERIC SQL_C_SBIGINT SQL_C_UBIGINT valamint az összes C intervallum adattípus, amely a C adattípusok című műben szerepel a D. mellékletben: Adattípusok. A meghajtó csak az ODBC verziókat támogatja a 3.50 előtti verziókban, és a ValueType érve SQL_C_GUID volt. |
| HYT01 | A kapcsolati időkorlát lejárt | A kapcsolat időtúllépési időtartama lejárt, mielőtt az adatforrás válaszolt a kérésre. A kapcsolat időtúllépési időszaka az SQLSetConnectAttr SQL_ATTR_CONNECTION_TIMEOUT keresztül van beállítva. |
| IM001 | Az illesztőprogram nem támogatja ezt a függvényt | (DM) Az StatementHandle-hez társított illesztőprogram nem támogatja a függvényt. |
Comments
Egy alkalmazás az SQLBindParameter rendszert hívja, hogy minden paraméterjelölőt megköt egy SQL utasításban. A kötések érvényben maradnak, amíg az alkalmazás újra meg nem hívja az SQLBindParameters-et, az SQLFreeStmt-t a SQL_RESET_PARAMS opcióval, vagy az SQLSetDescField-et addig, hogy az APD SQL_DESC_COUNT fejlécének mezőjét 0-ra állítsa.
További információ a paraméterekről a Utasítás Paraméterei résznél található. További információért a paraméteradattípusokról és paraméterjelölőkről lásd : Paraméteradat-típusok és paraméterjelölők a C mellékletben: SQL Nyelvtan.
Paraméterszám érvelés
Ha a ParameterNumber az SQLBindParameter hívásban nagyobb, mint az SQL_DESC_COUNT, akkor SQLSetDescField meghívható, hogy SQL_DESC_COUNT értékét ParameterNumber-re növelje.
InputOutputType érve
Az InputOutputType argumentum meghatározza a paraméter típusát. Ez az érv határozza meg az IPD SQL_DESC_PARAMETER_TYPE területét. Az SQL utasításokban minden olyan paraméter, amely nem hív eljárásokat, például INSERT utasításokat, bemenetiparaméter. Az eljáráshívások paraméterei lehetnek bemeneti, bemeneti/kimeneti vagy kimeneti paraméterek. (Egy alkalmazás az SQLProcedureColumns-t hívja, hogy meghatározza egy paraméter típusát egy eljáráshívásban; azok a paraméterek, amelyek típusa nem határozható meg, bemeneti paramétereknek számítunk.)
Az InputOutputType érve az alábbi értékek egyike:
SQL_PARAM_INPUT. A paraméter egy SQL utasításban olyan paramétert jelöl, amely nem hív eljárást, például egy INSERT utasítást, vagy egy bemeneti paramétert jelöl egy eljárásban. Például azINSERT INTO Employee VALUES (?, ?, ?) paraméterei bemeneti paraméterek, míg a {call AddEmp(?, ?, ?)} paraméterei lehetnek, de nem feltétlenül bemeneti paraméterek.
Amikor az utasítást végrehajtják, az illesztőprogram elküldi a paraméter adatait az adatforrásnak; a *ParameterValuePtr puffernek érvényes bemeneti értéket kell tartalmaznia, vagy a *StrLen_or_IndPtr puffernek tartalmaznia kell SQL_NULL_DATA, SQL_DATA_AT_EXEC vagy a SQL_LEN_DATA_AT_EXEC makró eredményét.
Ha egy alkalmazás nem tudja meghatározni egy paraméter típusát egy eljáráshívásban, az InputOutputType-t SQL_PARAM_INPUT-ra állítja; ha az adatforrás egy értéket ad vissza a paraméterhez, az illesztővezető eldobja azt.
SQL_PARAM_INPUT_OUTPUT. A paraméter egy eljárásban egy bemeneti/kimeneti paramétert jelöl. Például a {call GetEmpDept(?)} paramétere egy bemeneti/kimeneti paraméter, amely elfogadja az alkalmazott nevét, és visszaadja az alkalmazott részlegének nevét.
Amikor az utasítást végrehajtják, az illesztőprogram elküldi a paraméter adatait az adatforrásnak; a *ParameterValuePtr puffernek érvényes bemeneti értéket kell tartalmaznia, vagy a *StrLen_or_IndPtr puffernek tartalmaznia kell SQL_NULL_DATA, SQL_DATA_AT_EXEC vagy a SQL_LEN_DATA_AT_EXEC makró eredményét. A mondatkérés végrehajtása után az illezőprogram visszaadja az alkalmazás adatait a paraméterről; Ha az adatforrás nem ad vissza egy bemeneti/kimeneti paraméter értékét, az illesztőprogram a *StrLen_or_IndPtr puffert SQL_NULL_DATA-re állítja be.
Note
Amikor egy ODBC 1.0 alkalmazás egy ODBC 2.0 driverben hívja az SQLSetParam-ot , a Driver Manager ezt SQLBindParameter hívássá alakítja, amelyben az InputOutputType érve SQL_PARAM_INPUT_OUTPUT-re van beállítva.
SQL_PARAM_OUTPUT. A paraméter jelöli egy eljárás visszaküldési értékét vagy egy kimeneti paramétert egy eljárásban; Mindkét esetben ezeket kimeneti paramétereknek nevezik. Például a {?=call GetNextEmpID} paramétere egy kimeneti paraméter, amely a következő alkalmazotti azonosítót adja vissza.
A kijelentés végrehajtása után az illesztőprogram visszaadja az alkalmazás adatait a paraméterhez, kivéve, ha a ParameterValuePtr és az StrLen_or_IndPtr argumentum mindkettő null mutató, ebben az esetben az illesztőprogram eldobja a kimeneti értéket. Ha az adatforrás nem ad vissza egy kimeneti paraméter értékét, az illesztőprogram a *StrLen_or_IndPtr puffert SQL_NULL_DATA-re állítja be.
SQL_PARAM_INPUT_OUTPUT_STREAM. Jelzi, hogy egy bemeneti/kimeneti paramétert streamelni kell. Az SQLGetData képes paraméterértékeket olvasni részekben. A bufferLength-t figyelmen kívül hagyják, mert a pufferhossz az SQLGetData hívásával lesz meghatározva. A StrLen_or_IndPtr puffer értékének tartalmaznia kell SQL_NULL_DATA, SQL_DEFAULT_PARAM, SQL_DATA_AT_EXEC, vagy a SQL_LEN_DATA_AT_EXEC makró eredményét. Egy paramétert adat-végrehajtási (DAE) paraméterként kell bemenetnél korlátozni, ha kimenetnél streamelni fogják. A ParameterValuePtr lehet bármely nem null mutató érték, amelyet az SQLParamData felhasználó által definiált tokenként ad vissza, és amelynek értékét ParameterValuePtr-rel továbbították mind bemenetre, mind kimenetre. További információ: Kimeneti paraméterek lekérése AZ SQLGetData használatával.
SQL_PARAM_OUTPUT_STREAM. Ugyanúgy, mint SQL_PARAM_INPUT_OUTPUT_STREAM, egy kimeneti paraméterhez. * StrLen_or_IndPtr a bemenetnél figyelmen kívül hagyják.
Az alábbi táblázat különböző kombinációkat sorol: az InputOutputType és a *StrLen_or_IndPtr:
| InputOutputType | * StrLen_or_IndPtr | Eredmény | Megjegyzés a ParameterValuePtr témájában |
|---|---|---|---|
| SQL_PARAM_INPUT | SQL_LEN_DATA_AT_EXEC(len) vagy SQL_DATA_AT_EXEC | Bemenet részekben | A ParameterValuePtr bármely mutatóérték lehet, amelyet az SQLParamData a felhasználó által definiált tokenként ad vissza, és amelynek értékét a ParameterValuePtr továbbította. |
| SQL_PARAM_INPUT | Nem SQL_LEN_DATA_AT_EXEC(len) vagy SQL_DATA_AT_EXEC | Bemeneti kötött puffer | ParameterValuePtr a bemeneti puffer címe. |
| SQL_PARAM_OUTPUT | Figyelmen kívül hagyták a bemenetre. | Kimeneti kötött puffer | A ParameterValuePtr a kimeneti puffer címe. |
| SQL_PARAM_OUTPUT_STREAM | Figyelmen kívül hagyták a bemenetre. | Streamelt kimenet | A ParameterValuePtr bármely mutatóérték lehet, amelyet az SQLParamData a felhasználó által definiált tokenként ad vissza, amelynek értékét a ParameterValuePtr továbbította. |
| SQL_PARAM_INPUT_OUTPUT | SQL_LEN_DATA_AT_EXEC(len) vagy SQL_DATA_AT_EXEC | Bemenet alkatrészekben és kimeneti kötött puffer | A ParameterValuePtr a kimeneti puffer címe, amelyet az SQLParamData is a felhasználó által definiált tokenként ad vissza, amelynek értékét a ParameterValuePtr továbbította. |
| SQL_PARAM_INPUT_OUTPUT | Nem SQL_LEN_DATA_AT_EXEC(len) vagy SQL_DATA_AT_EXEC | Bemeneti puffer és kimeneti bound puffer | A ParameterValuePtr a megosztott bemenet/kimeneti puffer címe. |
| SQL_PARAM_INPUT_OUTPUT_STREAM | SQL_LEN_DATA_AT_EXEC(len) vagy SQL_DATA_AT_EXEC | Bemenet alkatrészekben és streamelt kimenet | ParameterValuePtr lehet bármilyen nem null mutató érték, amelyet az SQLParamData a felhasználó által definiált tokenként ad vissza, amelynek értékét a ParameterValuePtr-rel továbbították mind bemenetként, mind kimenetként. |
Note
Az illesztőprogramnak el kell döntenie, mely SQL típusok engedélyezettek, amikor egy alkalmazás egy kimeneti vagy bemenet-kimeneti paramétert köt streamelt állapotban. A driver manager nem generál hibát egy érvénytelen SQL típus esetén.
ValueType érv
Az ValueType érve megadja a paraméter C adattípusát. Ez az érv az APD SQL_DESC_TYPE, SQL_DESC_CONCISE_TYPE és SQL_DESC_DATETIME_INTERVAL_CODE mezőit határozza meg. Ez az egyik érték a D. melléklet: Adattípusok C adattípusok szekciójában.
Ha az ValueType argumentum az egyik intervallum adattípus, akkor az APD ParameterNumber rekordjának SQL_DESC_TYPE mezője SQL_INTERVAL-re van beállítva, az APD SQL_DESC_CONCISE_TYPE mezője a tömör intervallum adattípusra van állítva, és a ParameterNumber rekord SQL_DESC_DATETIME_INTERVAL_CODE mezője egy adott intervallum adattípus alkódjára van beállítva. (Lásd D melléklet: Adattípusok.) Az alapértelmezett intervallum elő pontosságot (2) és az alapértelmezett intervallum másodperceket (6) használják, ahogyan az APD SQL_DESC_DATETIME_INTERVAL_PRECISION és SQL_DESC_PRECISION mezőiben van beállítva, az adathoz. Ha bármelyik alapértelmezett pontosság nem megfelelő, az alkalmazásnak explicit módon be kell állítania a leíró mezőt SQLSetDescField vagy SQLSetDescRec hívással.
Ha a ValueType argumentum az egyik dátumidő-adattípus, akkor az APD ParameterNumber rekordjának SQL_DESC_TYPE mezője SQL_DATETIME-re van beállítva, az APD ParameterNumber rekordjának SQL_DESC_CONCISE_TYPE mezője a tömör dátum C adattípusra van állítva, míg a ParameterNumber rekord SQL_DESC_DATETIME_INTERVAL_CODE mezője egy adott dátumidő adattípushoz tartozó alkódra van állítva. (Lásd D melléklet: Adattípusok.)
Ha az ValueType érve SQL_C_NUMERIC adattípus, akkor az alapértelmezett pontosságot (amely illesztőprogramban definiált) és az alapértelmezett skála (0), ahogyan az APD SQL_DESC_PRECISION és SQL_DESC_SCALE mezőiben van beállítva, az adatokhoz kerül. Ha az alapértelmezett pontosság vagy skálázás nem megfelelő, az alkalmazásnak explicit módon be kell állítania a leíró mezőt egy SQLSetDescField vagy SQLSetDescRec hívással.
SQL_C_DEFAULT megadja, hogy a paraméterértéket az alapértelmezett C adattípusból kell áthelyezni az SQL adattípus ParameterType-val jelölt számára.
Megadhatsz egy kiterjesztett C adattípust is. További információ: C adattípusok az ODBC-ben.
További információért lásd: Alapértelmezett C adattípusok, Adatok átkonvertálása C-ből SQL-re, és Adatátalakítás SQL-ről C adattípusokra a D. mellékletben: Adattípusok.
ParameterType érv
Ennek az SQL Data Types szekcióban felsorolt értékek egyike lehet, amely a D. melléklet: Adattípusok részében szerepel, vagy illesztőgép-specifikus értéknek kell lennie. Ez az érv az IPD SQL_DESC_TYPE, SQL_DESC_CONCISE_TYPE és SQL_DESC_DATETIME_INTERVAL_CODE mezőit határozza meg.
Ha a ParameterType érve az egyik datetime azonosító, akkor az IPD SQL_DESC_TYPE mezője SQL_DATETIME-re, az IPD SQL_DESC_CONCISE_TYPE mezője a rövid datetime SQL adattípusra, a SQL_DESC_DATETIME_INTERVAL_CODE mező pedig a megfelelő datetime alkód értékre van állítva.
Ha a ParameterType az egyik intervallum azonosító, akkor az IPD SQL_DESC_TYPE mezője SQL_INTERVAL-re, az IPD SQL_DESC_CONCISE_TYPE mezője tömör SQL intervallum adattípusra, az IPD SQL_DESC_DATETIME_INTERVAL_CODE mezője pedig a megfelelő intervallum alkódra van állítva. Az IPD SQL_DESC_DATETIME_INTERVAL_PRECISION mezőjét a vezető intervallum pontosságára állítjuk be, a SQL_DESC_PRECISION mezőt pedig az intervallum másodpercek pontosságára, ha alkalmazható. Ha az alapértelmezett SQL_DESC_DATETIME_INTERVAL_PRECISION vagy SQL_DESC_PRECISION értéke nem megfelelő, az alkalmazásnak explicit módon be kell állítania az SQLSetDescField hívásával. További információért ezekről a mezőkről lásd: SQLSetDescField.
Ha az ValueType érve SQL_NUMERIC adattípus, akkor az alapértelmezett precizitást (amely illesztőként definiált) és az alapértelmezett skála (0), amelyet az IPD SQL_DESC_PRECISION és SQL_DESC_SCALE mezőiben állítanak be, az adatokhoz használják. Ha az alapértelmezett pontosság vagy skálázás nem megfelelő, az alkalmazásnak explicit módon be kell állítania a leíró mezőt egy SQLSetDescField vagy SQLSetDescRec hívással.
Az adatok átalakításáról információért lásd: Adatok átkonvertálása C-ből SQL adattípusokra és Adatátalakítás SQL-ből C-re az Adattípusok a D mellékletben: Adattípusok.
ColumnSize érv
A ColumnSize érve meghatározza az oszlop vagy kifejezés méretét, amely megfelel a paraméterjelzőnek, az adat hosszát, vagy mindkettőt. Ez az érv az IPD különböző mezőit állítja be az SQL adattípusától függően ( a ParameterType érve). A következő szabályok vonatkoznak erre a leképezésre:
Ha a ParameterType SQL_CHAR, SQL_VARCHAR, SQL_LONGVARCHAR, SQL_BINARY, SQL_VARBINARY, SQL_LONGVARBINARY, vagy az SQL rövid dátumidő- vagy intervallumadattípusa, akkor az IPD SQL_DESC_LENGTH mezője ColumnSize értékre van állítva. (További információért lásd a D. melléklet oszlopméret, tizedes számjegyek, átviteli oktet hossza és megjelenítési méret szakaszában.)
Ha a ParameterType SQL_DECIMAL, SQL_NUMERIC, SQL_FLOAT, SQL_REAL vagy SQL_DOUBLE, az IPD SQL_DESC_PRECISION mezője ColumnSize értékre van állítva.
Más adattípusoknál a ColumnSize érvet figyelmen kívül hagyjuk.
További információért lásd a "Paraméterértékek átadása" és SQL_DATA_AT_EXEC a "StrLen_or_IndPtr Argument" részben.
DecimaDigits érv
Ha a ParameterType SQL_TYPE_TIME, SQL_TYPE_TIMESTAMP, SQL_INTERVAL_SECOND, SQL_INTERVAL_DAY_TO_SECOND, SQL_INTERVAL_HOUR_TO_SECOND vagy SQL_INTERVAL_MINUTE_TO_SECOND, akkor az IPD SQL_DESC_PRECISION mezője DecimalDigits lesz. Ha a ParameterType SQL_NUMERIC vagy SQL_DECIMAL, az IPD SQL_DESC_SCALE mezője DecimalDigits-re van beállítva. Minden más adattípus esetén a DecimalDigits érvet figyelmen kívül hagyjuk.
ParameterValuePtr Argument
A ParameterValuePtr argumentum egy pufferre mutat, amely az SQLExecute vagy SQLExecDirect hívása esetén tartalmazza a paraméter tényleges adatait. Az adatoknak a ValueType argumentum által meghatározott formában kell lennie. Ez az érv határozza meg az APD SQL_DESC_DATA_PTR mezőjét. Egy alkalmazás beállíthatja a ParameterValuePtr argumentumot null mutatónak, amennyiben a *StrLen_or_IndPtr SQL_NULL_DATA vagy SQL_DATA_AT_EXEC. (Ez csak a bemeneti vagy bemeneti/kimeneti paraméterekre vonatkozik.)
Ha a *StrLen_or_IndPtr a SQL_LEN_DATA_AT_EXEC(hosszúság) makró vagy SQL_DATA_AT_EXEC eredménye, akkor a ParameterValuePtr egy alkalmazásban definiált mutatóérték, amely a paraméterhez kapcsolódik. Az SQLParamData segítségével visszaküldik az alkalmazásnak. Például a ParameterValuePtr lehet egy nem nulla token, például paraméterszám, adatra mutató vagy egy olyan struktúra mutatója, amelyet az alkalmazás használt a bemeneti paraméterek kötéséhez. Azonban fontos megjegyezni, hogy ha a paraméter bemenet/kimeneti paraméter, akkor a ParameterValuePtr-nek egy pufferre kell utalnia, ahol a kimeneti érték tároló lesz. Ha a SQL_ATTR_PARAMSET_SIZE utasítás attribútumának értéke nagyobb, mint 1, az alkalmazás használhatja az SQL_ATTR_PARAMS_PROCESSED_PTR kijelentés attribútumával jelölt értéket a ParameterValuePtr argumentummal együtt. Például a ParameterValuePtr egy értéktömbre mutathat, és az alkalmazás a SQL_ATTR_PARAMS_PROCESSED_PTR jelölt értéket használhatja, hogy a tömbből a helyes értéket visszanyerje. További információért lásd a "Paraméterértékek átadása" részt ebben a szakaszban.
Ha az InputOutputType érve SQL_PARAM_INPUT_OUTPUT vagy SQL_PARAM_OUTPUT, a ParameterValuePtr egy pufferre mutat, amelyben az illesztőprogram visszaadja a kimeneti értéket. Ha az eljárás egy vagy több eredményhalmazt ad vissza, a *ParameterValuePtr puffer nem garantált, hogy beállítható, amíg az összes eredményhalmaz/sorszám feldolgozása nem történt. Ha a puffer csak a feldolgozás befejezésével van beállítva, akkor a kimeneti paraméterek és a visszaküldési értékek nem elérhetők, amíg az SQLMoreResults SQL_NO_DATA vissza nem tér. Az SQLCloseCursor vagy SQLFreeStmt hívása SQL_CLOSE opcióval ezek az értékek törléséhez vezethet.
Ha a SQL_ATTR_PARAMSET_SIZE utasítás attribútumának értéke nagyobb, mint 1, ParameterValuePtr egy tömbrre mutat. Egy SQL utasítás feldolgozza a bemeneti vagy bemenet/kimeneti paraméter teljes bemeneti érték-tömbjét, és egy bemenet/kimenet vagy kimeneti paraméter értékeinek tömbjét adja vissza.
BufferLength érvelés
Karakter- és bináris C adat esetén a BufferLength érve megadja a *ParameterValuePtr puffer hosszát (ha egyetlen elemről van szó), vagy egy elem hosszát a *ParameterValuePtr tömbben (ha a SQL_ATTR_PARAMSET_SIZE utasítás értéke nagyobb, mint 1). Ez az érv határozza meg az APD SQL_DESC_OCTET_LENGTH rekordmezőjét. Ha az alkalmazás több értéket is megad, a BufferLength segítségével meghatározzák az értékek helyét a *ParameterValuePtr tömbben, mind a bemeneten, mind a kimeneten. Bemeneti/kimeneti és kimeneti paraméterek esetén azt határozzák meg, hogy a karakter- és bináris C adatokat a kimeneten lerövidítik-e:
C karakter adat esetén, ha a visszaadható bájtok száma nagyobb, mint a BufferLength, a *ParameterValuePtr adatait lerövidítik BufferLength-re levonva egy null-terminációs karakter hosszát, és a meghajtó null-terminálja őket.
Bináris C adat esetén, ha a visszahozható bájtok száma nagyobb, mint a BufferLength, a *ParameterValuePtr adatai BufferLength bájtokra rövidítik.
Minden más típusú C adatnál a BufferLength érvet figyelmen kívül hagyjuk. A *ParameterValuePtr puffer hossza (ha egyetlen elem) vagy egy elem hossza a *ParameterValuePtr tömbben (ha az alkalmazás az SQLSetStmtAttr-t hívja SQL_ATTR_PARAMSET_SIZE attribútumargumentummal több értéket megadni minden paraméterhez) feltételezzük a C adattípus hosszát.
Streamelt kimenet vagy streamelt input/kimenet paraméterek esetén a BufferLength érvet figyelmen kívül hagyjuk, mert a pufferhossz az SQLGetData által van megadva.
Note
Amikor egy ODBC 1.0 alkalmazás az SQLSetParam-ot hívja egy ODBC 3-ben. x driver esetén a Driver Manager ezt SQLBindParameter hívássá alakítja, amelyben a BufferLength érve mindig SQL_SETPARAM_VALUE_MAX. Mert a Driver Manager hibát ad vissza, ha ODBC 3. x alkalmazás beállítja a BufferLength-t SQL_SETPARAM_VALUE_MAX-re, ami egy ODBC 3-ra. az x illezőgép ezt használhatja annak meghatározására, mikor hívja meg egy ODBC 1.0 alkalmazás.
Note
Az SQLSetParamban az alkalmazás, ahogyan az alkalmazás meghatározza a *ParameterValuePtr puffer hosszát, hogy az illesztőprogram karakter- vagy bináris adatokat tudjon visszaadni, valamint az, ahogyan az alkalmazás karakter- vagy bináris paraméterértékeket küld a drivernek, az illesztőgép által definiált.
StrLen_or_IndPtr Érv
A StrLen_or_IndPtr érv egy olyan pufferre utal, amely az SQLExecute vagy SQLExecDirect hívása esetén az alábbiak egyikét tartalmazza. (Ez az érv beállítja az alkalmazás paramétermutatók SQL_DESC_OCTET_LENGTH_PTR és SQL_DESC_INDICATOR_PTR rekordmezőit.)
A *ParameterValuePtr-ben tárolt paraméterérték hossza. Ezt figyelmen kívül hagyják, kivéve a karakter- vagy bináris C adatot.
SQL_NTS. A paraméterérték egy null-végződésű string.
SQL_NULL_DATA. A paraméterérték NULL.
SQL_DEFAULT_PARAM. Egy eljárás az, hogy egy paraméter alapértelmezett értékét használják, nem pedig az alkalmazásból lekért értéket. Ez az érték csak az ODBC kanonikus szintaxisában hívott eljárásban érvényes, és akkor csak akkor, ha az InputOutputType érve SQL_PARAM_INPUT, SQL_PARAM_INPUT_OUTPUT vagy SQL_PARAM_INPUT_OUTPUT_STREAM. Amikor a *StrLen_or_IndPtr SQL_DEFAULT_PARAM, a ValueType, ParameterType, ColumnSize, DecimalDigits, BufferLength és ParameterValuePtr argumentumokat figyelmen kívül hagyják a bemeneti paraméterekhez, és csak a bemenet/kimeneti paraméterek kimeneti paraméterértékének meghatározására használják.
Ez a SQL_LEN_DATA_AT_EXEC(hosszúság) makró eredménye. A paraméter adatait az SQLPutData segítségével küldik. Ha a ParameterType érve SQL_LONGVARBINARY, SQL_LONGVARCHAR vagy hosszú, adatforrás-specifikus adattípus, és az illesztőprogram "Y"-t ad vissza a SQLGetInfo-ban a SQL_NEED_LONG_DATA_LEN információtípusra, a length a paraméterhez küldendő bájtszámú adat; ellenkező esetben a hosszúságnak nem negatív értéknek kell lennie, és figyelmen kívül hagyják. További információért lásd a "Paraméterértékek átadása" című részt ebben a szakaszban.
Például annak megadásához, hogy 10 000 bájtos adatot küldjenek SQLPutData segítségével egy vagy több hívásban, egy SQL_LONGVARCHAR paraméter esetén egy alkalmazás a *StrLen_or_IndPtr-t SQL_LEN_DATA_AT_EXEC(10000)-re állítja be.
SQL_DATA_AT_EXEC. A paraméter adatait az SQLPutData segítségével küldik. Ezt az értéket az ODBC 1.0 alkalmazások használják, amikor ODBC 3-at hívnak. X driver. További információért lásd a "Paraméterértékek átadása" című részt ebben a szakaszban.
Ha StrLen_or_IndPtr null mutató, akkor az illesztőprogram feltételezi, hogy minden bemeneti paraméterérték nem NULL, és hogy a karakter és a bináris adat null-véget ér. Ha az InputOutputType SQL_PARAM_OUTPUT vagy SQL_PARAM_OUTPUT_STREAM, és a ParameterValuePtr és StrLen_or_IndPtr mindkettő null mutatók, akkor az illesztőprogram eldobja a kimeneti értéket.
Note
Az alkalmazásfejlesztők erősen nem ajánlják meg null mutatót StrLen_or_IndPtr esetén, ha a paraméter adattípusa SQL_C_BINARY. Annak érdekében, hogy egy illesztőprogram ne vágja meg váratlanul SQL_C_BINARY adatokat, StrLen_or_IndPtr tartalmaznia kell egy mutatót egy érvényes hosszúsági értékre.
Ha az InputOutputType érve SQL_PARAM_INPUT_OUTPUT, SQL_PARAM_OUTPUT, SQL_PARAM_INPUT_OUTPUT_STREAM vagy SQL_PARAM_OUTPUT_STREAM, StrLen_or_IndPtr egy olyan pufferre mutat, amelyben az illesztőprogram SQL_NULL_DATA-t ad vissza, a *ParameterValuePtr visszaadható bájtainak számát (kivéve a null-terminációs karakter adat bájtját), vagy SQL_NO_TOTAL-re (ha a visszaadható bájtok száma nem határozható meg). Ha az eljárás egy vagy több eredményhalmazt ad vissza, a *StrLen_or_IndPtr puffer nem garantált, hogy beállítható az összes eredmény letöltéséig.
Ha a SQL_ATTR_PARAMSET_SIZE állítás attribútumának értéke nagyobb, mint 1 , StrLen_or_IndPtr SQLLEN értékek tömbére mutat. Ezek bármelyik korábbi érték lehetnek ebben a szakaszban, és egyetlen SQL utasítással dolgozzák fel őket.
Paraméterértékek átadása
Egy alkalmazás továbbíthatja egy paraméter értékét akár a *ParameterValuePtr pufferben, akár egy vagy több SQLPutData hívással. Azok a paraméterek, amelyek adatait SQLPutData segítségével továbbítják, adat-végrehajtási paramétereknek nevezik. Ezeket általában SQL_LONGVARBINARY és SQL_LONGVARCHAR paraméterek adatküldésére használják, és más paraméterekkel is összekeverhetők.
A paraméterértékek továbbításához egy alkalmazás a következő lépéssorozatot végzi:
Minden paraméterhez az SQLBindParameter segítségével puffereket köt a paraméter értékére (ParameterValuePtr argumentus) és a hossz/indikátorra (StrLen_or_IndPtr argumentum). Adat-végrehajtási paraméterek esetén a ParameterValuePtr egy alkalmazás által definiált mutatóérték, például paraméterszám vagy adatra mutató. Az értéket később visszaadják, és felhasználható a paraméter azonosítására.
A bemeneti és bemeneti/kimeneti paraméterek értékeit a *ParameterValuePtr és *StrLen_or_IndPtr pufferekben helyezi el:
Normál paraméterek esetén az alkalmazás a paraméterértéket a *ParameterValuePtr pufferbe, az érték hosszát pedig a *StrLen_or_IndPtr pufferbe helyezi. További információért lásd: Paraméterértékek beállítása.
Adat-végrehajtási paraméterek esetén az alkalmazás az SQL_LEN_DATA_AT_EXEC(hosszúság) makró eredményét (amikor ODBC 2.0 illesztőprogramot hív) a *StrLen_or_IndPtr pufferbe helyezi.
Az SQLExecute vagy SQLExecDirect hívása az SQL utasítás végrehajtásához.
Ha nincsenek adat-végrehajtáskor paraméterek, a folyamat befejezett.
Ha van adat-végrehajtási paraméter, a függvény SQL_NEED_DATA ad.
Az SQLParamData hívása a ParameterValuePtr argumentumban megadott alkalmazás-definiált értéket kéri az SQLBindParameter paraméterének első feldolgozásánál lévő adat-végrehajtási paraméteréhez. SQLParamData SQL_NEED_DATA visszaad.
Note
Bár az adat-végrehajtásnál paraméterek hasonlítanak az adat-végrehajtási oszlopokra, az SQLParamData által visszaadott érték mindegyiknél eltérő. Az adat-végrehajtás paraméterei olyan paraméterek az SQL utasításban, amelyekhez az adatokat SQLPutData segítségével küldik, amikor az utasítást SQLExecDirect vagy SQLExecute futtatják. A SQLBindParameterhez kötöttek. Az SQLParamData által visszaadott érték egy mutatóérték, amelyet a ParameterValuePtr argumentumban továbbítanak az SQLBindParameter számára. Az adat-végrehajtásnál lévő oszlopok olyan oszlopok egy sorhalmazban, amelyekhez az adatokat SQLPutData segítségével küldik, amikor egy sort frissítenek vagy hozzáadnak SQLBulkOperations-szel , vagy SQLSetPos-szal frissítve. Kötöttek az SQLBindCol-hoz. Az SQLParamData által visszaadott érték a *TargetValuePtr pufferben (amelyet SQLBindCol hívással állítanak be) a sor címe, amelyet feldolgoznak.
Az SQLPutData-t egy vagy többször hívja, hogy adatokat küldjön a paraméterhez. Ha az adatérték nagyobb, mint az SQLPutData által megadott *ParameterValuePtr puffer; ugyanazon paraméterre több hívás az SQLPutData-ra csak akkor engedélyezett, ha C karakter adatot küldenek egy oszlopba, amelynek karaktere, bináris vagy adatforrás-specifikus adattípusa van, vagy ha bináris C adatot küldünk egy oszlopba, ahol karakter, bináris vagy adatforrás-specifikus adattípus van.
Ismét az SQLParamData-t hívja, hogy jelezze, minden adatot elküldtek a paraméterhez.
Ha több adat-végrehajtásnál paraméter van, az SQLParamData SQL_NEED_DATA és az alkalmazás által definiált értéket adja vissza a következő feldolgozásra mutató adat-végrehajtási paraméterhez. A kérelem megismétli a 4. és 5. lépést.
Ha nincs több adat-végrehajtási paraméter, a folyamat befejezett. Ha az utasítást sikeresen végrehajtották, az SQLParamData SQL_SUCCESS vagy SQL_SUCCESS_WITH_INFO értéket ad vissza; ha a végrehajtás sikertelen volt, SQL_ERROR visszaad. Ezen a ponton az SQLParamData bármilyen SQLSTATE-t vissza tud adni, amelyet az a függvény (SQLExecDirect vagy SQLExecute) tud visszaadni.
Bármely bemeneti/kimeneti vagy kimeneti paraméter kimeneti értékei elérhetők a *ParameterValuePtr és *StrLen_or_IndPtr pufferekben, miután az alkalmazás visszanyeri az utasítás által generált összes eredményhalmazt.
Az SQLExecute vagy SQLExecDirect hívása SQL_NEED_DATA állapotba kerül. Ezen a ponton az alkalmazás csak az SQLCancel, SQLGetDiagField, SQLGetDiagRec, SQLGetFunctions, SQLParamData vagy SQLPutData fájlokat hívhatja az állításhoz tartozó utasítással vagy kapcsolati handle-vel . Ha bármilyen más függvényt hív az utasítással vagy a hozzá kapcsolódó kapcsolattal, a függvény visszaadja a SQLSTATE HY010-et (Függvénysorozat hiba). Az utasítás akkor hagyja el a SQL_NEED_DATA állapotot, amikor SQLParamData vagy SQLPutData hibát ad vissza, SQLParamData SQL_SUCCESS vagy SQL_SUCCESS_WITH_INFO visszaadja az utasítást, vagy a kijelentést töröljük.
Ha az alkalmazás akkor hívja az SQLCancel-t , miközben az illezőprogramnak még adatra van szüksége adat-végrehajtási paraméterekhez, az illesztőprogram megszünteti az utasításvégrehajtást; az alkalmazás ezután ismét hívhatja az SQLExecute vagy SQLExecDirect .
Streamelt kimeneti paraméterek visszakeresése
Amikor egy alkalmazás az InputOutputType-t SQL_PARAM_INPUT_OUTPUT_STREAM vagy SQL_PARAM_OUTPUT_STREAM beállítja, a kimeneti paraméterértéket egy vagy több SQLGetData hívással kell visszanyerni. Ha az illezőprogramnak van egy streamelt kimeneti paraméterértéke, amit vissza kell adni az alkalmazásnak, akkor a következő függvények hívására SQL_PARAM_DATA_AVAILABLE vissza fog térni: SQLMoreResults, SQLExecute és SQLExecDirect. Egy alkalmazás az SQLParamData segítségével meghatározza, melyik paraméterérték érhető el.
További információért a SQL_PARAM_DATA_AVAILABLE és streamelt kimeneti paraméterekről lásd: Kimeneti paraméterek visszakeresése SQLGetData segítségével.
Paraméterek tömbjeinek használata
Amikor egy alkalmazás paraméterjelölőkkel ír elő egy utasítást, és paraméterekből álló tömböt továbbít, kétféleképpen lehet ezt végrehajtani. Az egyik lehetőség, hogy a meghajtó a háttérrendszer tömbfeldolgozó képességeire támaszkodik, ebben az esetben az egész állítás paraméterekkel együtt egyetlen atomi egységként kezelik. Az Oracle egy példa olyan adatforrásra, amely támogatja a tömbfeldolgozási képességeket. Ennek a funkciónak a megvalósításának egy másik módja, ha az illesztőprogram létrehoz egy adag SQL utasítást, egy SQL utasítást minden paraméterhalmazhoz a paramétertömbben, és végrehajtja a csomagot. Paramétertömbök nem használhatók egyUPDATE WHERE CURRENT állítással.
Amikor egy paramétertömböt feldolgoznak, egyedi eredményhalmazok/sorszámok (egy-egy minden paraméterhalmazhoz) elérhetők lehetnek, vagy az eredményhalmazokat/sorszámokat össze lehet gyűlni. Az SQLGetInfo SQL_PARAM_ARRAY_ROW_COUNTS opciója jelzi, hogy minden paraméterkészlethez (SQL_PARC_BATCH) elérhető-e sorszám, vagy csak egy sorszám (SQL_PARC_NO_BATCH).
Az SQLGetInfo SQL_PARAM_ARRAY_SELECTS opciója jelzi, hogy minden paraméterhalmazra (SQL_PAS_BATCH) elérhető-e egy eredményhalmaz, vagy csak egy eredményhalmaz (SQL_PAS_NO_BATCH). Ha az illesztőprogram nem engedi, hogy egy eredményhalmaz-generáló utasítást paraméterek tömbjével hajtson végre, akkor SQL_PARAM_ARRAY_SELECTS SQL_PAS_NO_SELECT-et ad vissza.
További információért lásd: SQLGetInfo Function.
A paramétertömbök támogatásához a SQL_ATTR_PARAMSET_SIZE állítás attribútumát úgy állítjuk be, hogy megadja az egyes paraméterek értékeinek számát. Ha a mező nagyobb, mint 1, az APD SQL_DESC_DATA_PTR, SQL_DESC_INDICATOR_PTR és SQL_DESC_OCTET_LENGTH_PTR mezői tömbökre kell mutatniuk. Minden tömb kardinalitása egyenlő SQL_ATTR_PARAMSET_SIZE értékével.
Az APD SQL_DESC_ROWS_PROCESSED_PTR mezője egy pufferre mutat, amely tartalmazza a feldolgozott paraméterhalmazokat, beleértve a hibahalmazokat is. Ahogy minden paraméterkészlet feldolgozódik, az illesztőprogram új értéket tárol a pufferben. Nem kap vissza egy számot, ha null mutatóról van szó. Paramétertömbök használatakor, az APD SQL_DESC_ROWS_PROCESSED_PTR mezője által mutatott érték akkor is feltöltődik, ha a beállítási függvény visszaadja SQL_ERROR. Ha SQL_NEED_DATA visszatér, az APD SQL_DESC_ROWS_PROCESSED_PTR mezője által mutatott érték a feldolgozott paraméterek halmazára van beállítva.
Mi történik, amikor egy paramétertömb kötött és egy UPDATE WHERE CURRENT OF utasítást hajtanak végre, az meghajtó által definiált.
Column-Wise Paraméterkötés
Oszloponkénti kötésben az alkalmazás külön paraméter- és hosszúság/mutató tömböket köt minden paraméterhez.
Az oszloponkénti kötéshez az alkalmazás először a SQL_ATTR_PARAM_BIND_TYPE állítás attribútumát SQL_PARAM_BIND_BY_COLUMN-re állítja be. (Ez az alapértelmezett.) Minden oszlop kötözéséhez az alkalmazás a következő lépéseket végzi:
Paraméterpuffer tömböt oszt ki.
Hossz/indikátor pufferekből álló tömböt oszt ki.
Note
Ha az alkalmazás közvetlenül írja a leírókat oszloponkénti kötés esetén, külön tömbök használhatók a hosszúsághoz és az indikátoradatokhoz.
Az SQLBindParameter a következő argumentumokkal hívja meg:
A ValueType egyetlen elem C típusa a paraméterpuffer tömbben.
A ParameterType a paraméter SQL típusa.
A ParameterValuePtr a paraméterpuffer tömb címe.
A bufferLength egyetlen elem mérete a paraméterpuffer tömbben. A BufferLength érvet figyelmen kívül hagyják, ha az adat fix hosszúságú adat.
StrLen_or_IndPtr a hosszúság/mutató tömb címe.
További információért az információ felhasználásáról lásd a "ParameterValuePtr Argument" (ParameterValuePtr argument) a "Hozzászólásokban", a későbbi részben. További információért a paraméterek oszloponkénti kötéséről lásd: Paraméterek kötözési sorai.
Row-Wise Paraméterkötés
Soronként kötött megoldásban az alkalmazás olyan struktúrát definiál, amely paraméter- és hosszúság/indikátorpuffereket tartalmaz minden kötött paraméterhez.
A soronkénti kötés alkalmazásához az alkalmazás a következő lépéseket végzi:
Meghatároz egy struktúrát, amely egyetlen paraméterkészletet tartalmaz (beleértve mind a paramétereket, mind a hosszúság/mutató puffereket), és ezen struktúrák tömbjét osztja ki.
Note
Ha az alkalmazás közvetlenül írja a leírókat soronkénti kötés során, külön mezők használhatók a hosszúság- és indikátoradatokhoz.
A SQL_ATTR_PARAM_BIND_TYPE állítás attribútumát annak a struktúrának a méretére állítja, amely egyetlen paraméterhalmazt tartalmaz, vagy egy olyan puffer példányának méretére, amelybe a paraméterek kötve lesznek. A hosszúságnak tartalmaznia kell a teret az összes kötött paraméterhez, valamint a struktúra vagy puffer bármilyen kiegészítését, hogy biztosítsák, hogy amikor egy határérték címét a megadott hosszúsággal növeljük, az eredmény a következő sorban ugyanazon paraméter elejére mutat. Ha az ANSI C-ben a sizeof operátort használod, ez a viselkedés garantált.
Az SQLBindParameter a következő argumentumokkal hívja meg minden korlátozott paraméterre:
A ValueType az a típus, amelyet a paraméterpuffer tag az oszlophoz kötött.
A ParameterType a paraméter SQL típusa.
A ParameterValuePtr az első tömbelem paraméterpuffer tagjának címe.
BufferLength a paraméter puffertagjának mérete.
StrLen_or_IndPtr a kötözendő hosszúság/mutató tag címe.
További információért az információ felhasználásáról lásd a "ParameterValuePtr argument" (ParameterValuePtr argument) című részt. További információért a paraméterek soronkénti kötéséről lásd a Paraméterek kötési tömbök című részt.
Hibainformációk
Ha egy illesztőprogram nem hajt végre paramétertömböket kötetként (a SQL_PARAM_ARRAY_ROW_COUNTS opció egyenlő SQL_PARC_NO_BATCH-vel), akkor a hibahelyzeteket úgy kezelik, mintha egy utasítást futtattak volna. Ha az illesztőprogram valóban rendszeres paramétertömböket valósít meg, az alkalmazás az IPD SQL_DESC_ARRAY_STATUS_PTR fejlécének mezőjét használhatja annak meghatározására, hogy az SQL utasítás melyik paramétere vagy melyik paraméter okozza az SQLExecDirect vagy SQLExecute hibát. Ez a mező minden paraméterérték sorához tartozó állapotinformációkat tartalmaz. Ha a mező hibát jelez, a diagnosztikai adatszerkezet mezői jelzik a meghibásodott paraméter sorát és paraméterszámát. A tömbben lévő elemek számát az APD SQL_DESC_ARRAY_SIZE fejlécelőmezője határozza meg, amelyet a SQL_ATTR_PARAMSET_SIZE mondattribútuma állít be.
Note
Az APD SQL_DESC_ARRAY_STATUS_PTR fejlécmezőjét a paraméterek figyelmen kívül hagyására használják. További információért a paraméterek figyelmen kívül hagyásával kapcsolatos következő részben: "Paraméterek halmazának figyelmen kívül hagyása."
Amikor az SQLExecute vagy SQLExecDirect SQL_ERROR-t ad, az IPD SQL_DESC_ARRAY_STATUS_PTR mező által mutatott tömbben lévő elemek SQL_PARAM_ERROR, SQL_PARAM_SUCCESS, SQL_PARAM_SUCCESS_WITH_INFO, SQL_PARAM_UNUSED vagy SQL_PARAM_DIAG_UNAVAILABLE tartalmazni fogják.
A tömb minden eleméhez a diagnosztikai adatszerkezet egy vagy több állapotrekordot tartalmaz. A struktúra SQL_DIAG_ROW_NUMBER mezője jelzi a hibát okozó paraméterértékek sorszámát. Ha lehetséges meghatározni azt a paramétert a hibát okozó paramétersorban, a paraméterszámot a SQL_DIAG_COLUMN_NUMBER mezőbe írjuk.
SQL_PARAM_UNUSED akkor kerül be, ha egy paramétert nem használtak, mert egy korábbi paraméterben történt hiba, amely miatt az SQLExecute vagy az SQLExecDirect megszakításra kényszerítette az SQLExecute-t vagy az SQLExecDirect-et. Például, ha 50 paraméter van, és a negyvenedik paraméterkészlet végrehajtása során hiba történt, amely miatt az SQLExecute vagy SQLExecDirect megszakította a rendszert, akkor SQL_PARAM_UNUSED kerül be a 41-től 50-ig terjedő paraméterek állapottömbjébe.
SQL_PARAM_DIAG_UNAVAILABLE akkor kerül be, amikor az illezőprogramos paramétertömböket monolitikus egységként kezeli, így nem generálja ezt az egyedi paraméterszintű hibainformációt.
Néhány hiba egyetlen paraméterhalmazának feldolgozásában a következő paraméterhalmazok feldolgozása megáll. Más hibák nem befolyásolják a későbbi paraméterek feldolgozását. Melyik hiba megállítja a feldolgozást, az illesztőgép által definiált. Ha a feldolgozás nem áll meg, a tömbben lévő összes paraméter feldolgozódik, SQL_SUCCESS_WITH_INFO a hiba eredményeként visszatér, és az SQL_ATTR_PARAMS_PROCESSED_PTR által definiált puffer a feldolgozott paraméterek összesített számára van beállítva (ahogy az SQL_ATTR_PARAMSET_SIZE utasítás attribútum definiál), amely tartalmazza a hibahalmazokat is.
Caution
Az ODBC viselkedése, amikor hiba történik egy paraméterek tömbje feldolgozásában, az ODBC 3-ban eltér. x , mint az ODBC 2-ben. x. Az ODBC 2-ben. x, a funkció SQL_ERROR visszatért és a feldolgozás megállt. Az SQLParamOptionspirow argumentumával jelölt puffer tartalmazta a hibasor számát. Az ODBC 3-ban. x, a függvény SQL_SUCCESS_WITH_INFO visszaad, és a feldolgozás vagy leállhat, vagy folytathatja. Ha ez folytatódik, az SQL_ATTR_PARAMS_PROCESSED_PTR által megadott puffer minden feldolgozott paraméter értékére lesz beállítva, beleértve azokat is, amelyek hibát okoztak. Ez a viselkedésváltozás problémákat okozhat a meglévő alkalmazások számára.
Amikor az SQLExecute vagy SQLExecDirect visszatér, mielőtt befejezte az összes paraméterhalmaz feldolgozását egy paramétertömbben, például amikor SQL_ERROR vagy SQL_NEED_DATA visszatér, az állapottömb tartalmazza azokat a paramétereket, amelyeket már feldolgoztak. Az IPD-ben a SQL_DESC_ROWS_PROCESSED_PTR mező által mutatott hely tartalmazza a paramétertömbben szereplő sorszámot, amely a SQL_ERROR vagy SQL_NEED_DATA hibakódot okozta. Amikor egy paramétertömböt küldenek egy SELECT utasításhoz, az állapottömbértékek elérhetősége illesztőként definiálható; Elérhetők lehetnek a kijelentés végrehajtása után vagy az eredményhalmazok lehívásakor.
Paraméterek figyelmen kívül hagyása
Az APD SQL_DESC_ARRAY_STATUS_PTR mezője (ahogy az SQL_ATTR_PARAM_STATUS_PTR utasítás attribútuma állítja be) arra utalhat, hogy egy SQL utasításban lévő kötött paraméterek halmazát figyelmen kívül kell hagyni. Ahhoz, hogy az illesztőprogramot egy vagy több paraméterkészlet figyelmen kívül hagyására irányítsa a végrehajtás során, az alkalmazásnak a következő lépéseket kell követnie:
Hívjuk az SQLSetDescField-et , hogy az APD SQL_DESC_ARRAY_STATUS_PTR fejlécének mezét úgy állítsa be, hogy egy SQLUSMALLINT értékekből álló tömbbe mutasson státuszinformációt. Ez a mező beállítható, ha az SQLSetStmtAttr hívása SQL_ATTR_PARAM_OPERATION_PTR attribútummal szól, így az alkalmazás képes beállítani a mezőt anélkül, hogy leíró fogantyút kapna.
Az APD SQL_DESC_ARRAY_STATUS_PTR mezője által meghatározott tömb minden elemét két érték egyikére állítsuk be:
SQL_PARAM_IGNORE, hogy jelezze, hogy a sor ki van zárva az utasítás végrehajtásából.
SQL_PARAM_PROCEED, hogy jelezze, hogy a sor be van építve az utasításvégrehajtásba.
Hívjuk az SQLExecDirect-et vagy SQLExecute-t az előkészített utasítás végrehajtásához.
Az alábbi szabályok érvényesek az APD SQL_DESC_ARRAY_STATUS_PTR mező által meghatározott tömbre:
A mutató alapértelmezés szerint nullra van állítva.
Ha a mutató null, akkor minden paraméterhalmazt használnak, mintha minden elemet SQL_ROW_PROCEED-re állítanánk.
Egy elem SQL_PARAM_PROCEED-re beállítása nem garantálja, hogy a művelet ezt a paraméterkészletet használja.
SQL_PARAM_PROCEED a fejlécfájlban 0-ként van definiálva.
Egy alkalmazás beállíthatja az APD SQL_DESC_ARRAY_STATUS_PTR mezőjét úgy, hogy ugyanarra a tömbre mutass, mint amit az IRD SQL_DESC_ARRAY_STATUS_PTR mező mutat. Ez hasznos, amikor paramétereket soradatokhoz kötnek. A paramétereket ezután figyelmen kívül lehet hagyni a sor adatai állapota szerint. A SQL_PARAM_IGNORE mellett a következő kódok miatt egy SQL utasításban szereplő paramétert figyelmen kívül hagynak: SQL_ROW_DELETED, SQL_ROW_UPDATED és SQL_ROW_ERROR. A SQL_PARAM_PROCEED mellett a következő kódok vezetnek egy SQL utasítás előrehaladásához: SQL_ROW_SUCCESS, SQL_ROW_SUCCESS_WITH_INFO és SQL_ROW_ADDED.
Újrakötési paraméterek
Egy alkalmazás két műveletet végezhet a kötés megváltoztatásához:
Hívjuk az SQLBindParameter függvényét, hogy új kötést határozz meg egy már kötött oszlophoz. A meghajtó felülírja a régi kötést az újabbal.
Megadjon egy olyan offsetet, amelyet hozzáadunk a puffercímhez, amelyet az SQLBindParameter kötési hívása adott meg. További információért lásd a következő szakaszt, "Újrakötés offsetekkel."
Újrakötés offsetekkel
A paraméterek újrakötése különösen hasznos, ha egy alkalmazásnak olyan pufferterület-beállítása van, amely sok paramétert tartalmazhat, de az SQLExecDirect vagy SQLExecute hívása csak néhány paramétert használ. A pufferterület fennmaradó helyét a következő paraméterkészlethez lehet használni, ha a meglévő kötést egy eltolással módosítjuk.
Az APD SQL_DESC_BIND_OFFSET_PTR fejlécmezője a kötés eltolására utal. Ha a mező nem null, a meghajtó dehivatkozással kezeli az intort, és ha a SQL_DESC_DATA_PTR, SQL_DESC_INDICATOR_PTR és SQL_DESC_OCTET_LENGTH_PTR mezők egyik értéke sem null mutató, akkor a dehivatkozást hozzáadja ezekhez a defreferencia értékekhez a leíró rekordokban a végrehajtáskor is. Az új mutatóértékeket akkor használják, amikor az SQL utasításokat végrehajtják. Az elmozdulás újrakötés után is érvényes marad. Mivel SQL_DESC_BIND_OFFSET_PTR az offset mutatója, nem magának az offsetnek, az alkalmazás közvetlenül megváltoztathatja az offsetet, anélkül, hogy SQLSetDescField vagy SQLSetDescRec hívása lenne a leíró mező megváltoztatásához. A mutató alapértelmezés szerint nullra van állítva. Az ARD SQL_DESC_BIND_OFFSET_PTR mezője beállíthatható SQLSetDescField hívással vagy SQLSetStmtAttr hívással SQL_ATTR_PARAM_BIND_OFFSET_PTR fAtttribútummal .
A kötési eltolást mindig közvetlenül hozzáadják az SQL_DESC_DATA_PTR, SQL_DESC_INDICATOR_PTR és SQL_DESC_OCTET_LENGTH_PTR mezők értékeihez. Ha az elmozdulat más értékre változik, az új érték továbbra is közvetlenül hozzáadódik az egyes leíró mezők értékéhez. Az új elolást nem adják hozzá a mezőérték és a korábbi eltolások összegéhez.
Leírók
A paraméter határát az APD-k és IPD-k mezői határozzák meg. Az SQLBindParameter argumentumai az ilyen leíró mezők beállításához szolgálnak. A mezők az SQLSetDescField függvények által is beállítható, bár az SQLBindParameter hatékonyabb használata, mivel az alkalmazásnak nem kell descriptor handle beszereznie az SQLBindParameter meghívásához.
Caution
Az SQLBindParameter hívása egy utasításhoz más utasításokat is befolyásolhat. Ez akkor történik, amikor az állításhoz kapcsolódó ARD kifejezetten el van osztva, és más állításokkal is összefügg. Mivel az SQLBindParameter módosítja az APD mezőit, a módosítások minden olyan állításra vonatkoznak, amelyekhez ez a leíró kapcsolódik. Ha ez nem a szükséges viselkedés, az alkalmazásnak el kell választania ezt a leírót a többi utasítástól, mielőtt az SQLBindParametert hívja.
Koncepcionálisan az SQLBindParameter a következő lépéseket végzi egymás után:
Meghívja az SQLGetStmtAttr-t az APD handle megszerzéséhez.
Az SQLGetDescField segítségével megkapja az APD SQL_DESC_COUNT mezőjét, és ha a ColumnNumber argumentum értéke meghaladja a SQL_DESC_COUNT értékét, akkor az SQLSetDescField-et hívja, hogy növelje SQL_DESC_COUNT értékét ColumnNumber-ig.
Többször is hívja az SQLSetDescField-et , hogy értékeket rendeljen az APD következő mezőihez:
A SQL_DESC_TYPE és SQL_DESC_CONCISE_TYPE a ValueType értékéhez tartozik, kivéve, hogy ha a ValueType egy dátum vagy intervallum altípus egyik tömör azonosítója, akkor a SQL_DESC_TYPE-et SQL_DATETIME-re vagy SQL_INTERVAL-re állítja be, a SQL_DESC_CONCISE_TYPE-t a rövid azonosítóhoz, és SQL_DESC_DATETIME_INTERVAL_CODE-et a megfelelő dátumidő- vagy intervallum alkódhoz.
A SQL_DESC_OCTET_LENGTH mezőt BufferLength értékre állítja be.
A SQL_DESC_DATA_PTR mezőt ParameterValue értékre állítja be.
A SQL_DESC_OCTET_LENGTH_PTR mezőt StrLen_or_Ind értékre állítja.
A SQL_DESC_INDICATOR_PTR mezőt is StrLen_or_Ind értékre állítja.
A StrLen_or_Ind paraméter meghatározza mind az indikátor információját, mind a paraméter értékének hosszát.
Meghívja az SQLGetStmtAttr-t az IPD fogantyúhoz.
Az SQLGetDescField meghívása az IPD SQL_DESC_COUNT mezőjének megszerzéséhez, és ha a ColumnNumber érve meghaladja az SQL_DESC_COUNT értékét, akkor az SQLSetDescField értéket hívja, hogy növelje SQL_DESC_COUNT értékét ColumnNumber-re.
Többször is hívja az SQLSetDescField-et , hogy értékeket rendeljen az IPD következő mezőinek:
A SQL_DESC_TYPE és SQL_DESC_CONCISE_TYPE halmozódik a ParameterType értékéhez, kivéve, ha a ParameterType egy dátum vagy intervallum altípus tömör azonosítója, akkor SQL_DESC_TYPE-et SQL_DATETIME-re vagy SQL_INTERVAL-re állít be, a rövid azonosító SQL_DESC_CONCISE_TYPE-jét, és a megfelelő dátumidőpont vagy intervallum alkódot SQL_DESC_DATETIME_INTERVAL_CODE.
Egy vagy több SQL_DESC_LENGTH, SQL_DESC_PRECISION és SQL_DESC_DATETIME_INTERVAL_PRECISION beállítja, ahogy a ParameterType megfelelően.
A SQL_DESC_SCALE DecimalDigits értékére állítja be.
Ha az SQLBindParameter hívása sikertelen, az APD-ben beállított leíró mezők tartalmának tartalma nem lesz, és az APD SQL_DESC_COUNT mezője változatlan. Ezen felül az IPD megfelelő rekordjának SQL_DESC_LENGTH, SQL_DESC_PRECISION, SQL_DESC_SCALE és SQL_DESC_TYPE mezői nem definiáltak, és az IPD SQL_DESC_COUNT mezője változatlan.
Hívások átalakítása SQLSetParam-ra és onnan
Amikor egy ODBC 1.0 alkalmazás az SQLSetParam-ot hívja egy ODBC 3-ben. x driver, az ODBC 3. x Driver Manager a hívást a következő táblázat szerint jelöli meg.
| Hívás az ODBC 1.0 alkalmazással | Hívja az ODBC 3-at. x driver |
|---|---|
| SQLSetParam( StatementHandle, ParameterNumber, ValueType, ParameterType, LengthPrecision, ParameterScale, ParameterValuePtr, StrLen_or_IndPtr); | SQLBindParameter( StatementHandle, ParameterNumber, SQL_PARAM_INPUT_OUTPUT, ValueType, ParameterType, ColumnSize, DecimalDigits, ParameterValuePtr, SQL_SETPARAM_VALUE_MAX, StrLen_or_IndPtr); |
Examples
A. Használd SQLBindParameter függvényt
A következő példában egy alkalmazás SQL utasítást készít, hogy adatokat helyezzen be a ORDERS táblába. Az utasítás minden paraméteréhez az alkalmazás az SQLBindParameter rendszert hívja, hogy megadja az ODBC C adattípust és az SQL adattípust, valamint puffert köt minden paraméterhez. Minden adatsorhoz az alkalmazás adatértékeket rendel minden paraméterhez, és az SQLExecute-t hívja az utasítás végrehajtásához.
A következő minta feltételezi, hogy a számítógépedben van egy ODBC adatforrás, a Northwind, amely a Northwind adatbázishoz kapcsolódik.
További kódpéldákért lásd: SQLBulkOperations Function, SQLProcedures Function, SQLPutData Function és 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. Tárolt eljárás végrehajtása egy elnevezett paraméterrel
A következő példában egy alkalmazás egy SQL Server tárolt eljárást hajt végre egy nevelt paraméter segítségével.
// 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);
}
Kapcsolódó funkciók
| Információ erről: | Nézze |
|---|---|
| Paraméterről szóló információ visszaküldése egy állításban | SQLDescribeParam függvény |
| SQL utasítás végrehajtása | SQLExecDirect függvény |
| Előkészített SQL-utasítás végrehajtása | SQLExecute függvény |
| Paraméterpufferek felszabadítása az állításon | SQLFreeStmt függvény |
| Az állításparaméterek számának visszaadása | SQLNumParams függvény |
| A következő paraméter visszaadása az adatok elküldéséhez: | SQLParamData függvény |
| Több paraméterérték meghatározása | SQLParamOptions funkció |
| Paraméteradatok küldése végrehajtási időpontban | SQLPutData függvény |
Lásd még
ODBC API-referencia
ODBC-fejlécfájlok
Kimeneti paraméterek lekérdezése SQLGetData segítségével