Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Soulad
Zavedená verze: ODBC 1.0 Soulad standardů: ODBC
Shrnutí
SQLDescribeParam vrací popis parametru spojeného s připraveným SQL příkazem. Tyto informace jsou také dostupné v oblastech IPD.
Syntax
SQLRETURN SQLDescribeParam(
SQLHSTMT StatementHandle,
SQLUSMALLINT ParameterNumber,
SQLSMALLINT * DataTypePtr,
SQLULEN * ParameterSizePtr,
SQLSMALLINT * DecimalDigitsPtr,
SQLSMALLINT * NullablePtr);
Arguments
StatementHandle
[Vstup] Popisovač příkazu
ParameterNumber
[Vstup] Číslo markeru parametru seřazeno postupně v rostoucím pořadí parametrů, začínaje na 1.
DataTypePtr
[Výstup] Ukazatel na buffer, do kterého se vrací SQL datový typ parametru. Tato hodnota se čte z pole SQL_DESC_CONCISE_TYPE záznamu IPD. To bude jedna z hodnot v sekci SQL datové typy v příloze D: Datové typy, nebo specifický SQL datový typ pro ovladače.
V ODBC 3. x, SQL_TYPE_DATE, SQL_TYPE_TIME nebo SQL_TYPE_TIMESTAMP budou vráceny v *DataTypePtr pro data, čas nebo časová data; v ODBC 2. X, SQL_DATE, SQL_TIME nebo SQL_TIMESTAMP budou vráceny. Správce ovladačů provádí požadovaná mapování při ODBC 2. x aplikace pracuje s ODBC 3. x ovladač nebo když je ODBC 3. x aplikace pracuje s ODBC 2. X driver.
Když je ColumnNumber roven 0 (pro sloupec záložek), SQL_BINARY se vrací v *DataTypePtr pro záložky s proměnnou délkou. (SQL_INTEGER se vrátí, pokud jsou záložky použity ODBC 3. x aplikace s ODBC 2. x nebo pomocí ODBC 2. x aplikace s ODBC 3. x driver.)
Pro více informací viz SQL datové typy v příloze D: Datové typy. Informace o datových typech SQL specifických pro ovladače najdete v dokumentaci ovladače.
ParameterSizePtr
[Výstup] Ukazatel na buffer, do kterého se vrací velikost sloupce nebo výrazu příslušného parametru podle znaků definovaného datovým zdrojem. Pro více informací o velikosti sloupců viz Velikost sloupce, Desetinné číslice, Délka přenosového oktetu a Velikost displeje.
DecimalDigitsPtr
[Výstup] Ukazatel na buffer, do kterého se vrátí počet desetinných číslic sloupce nebo výrazu odpovídajícího parametru definovaného zdrojem dat. Pro více informací o desetinných číslicích viz Velikost sloupce, Desetinné číslice, Délka přenosového oktetu a Velikost displeje.
NullablePtr
[Výstup] Ukazatel na buffer, do kterého se vrátí hodnota, která indikuje, zda parametr povoluje hodnoty NULL. Tato hodnota se čte z SQL_DESC_NULLABLE pole IPD. Jedna z následujících možností:
SQL_NO_NULLS: Parametr neumožňuje hodnoty NULL (to je výchozí hodnota).
SQL_NULLABLE: Parametr umožňuje hodnoty NULL.
SQL_NULLABLE_UNKNOWN: Ovladač nemůže určit, zda parametr povoluje hodnoty NULL.
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_ERROR nebo SQL_INVALID_HANDLE.
Diagnostics
Když SQLDescribeParam vrátí SQL_ERROR nebo SQL_SUCCESS_WITH_INFO, lze získat přidruženou hodnotu SQLstate, pokud vyvoláte SQLGetDiagRec s HandleType SQL_HANDLE_STMT a HandleStatementHandle. Následující tabulka uvádí hodnoty SQLSTATE, které obvykle vrací SQLDescribeParam , 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.) |
| 07009 | Index neplatných deskriptorů | (DM) Hodnota určená pro argument ParameterNumber je menší než 1. Hodnota zadaná pro argument ParameterNumber byla větší než počet parametrů v příslušném SQL příkazu. Parametrový marker byl součástí ne-DML příkazu. Marker parametru byl součástí seznamu SELECT . |
| 08S01 | Selhání komunikačního propojení | Komunikační propojení mezi ovladačem a zdrojem dat, ke kterému byl ovladač připojen, selhalo před dokončením zpracování funkce. |
| 21S01 | Seznam vložených hodnot neodpovídá seznamu sloupců | Počet parametrů ve příkazu INSERT neodpovídal počtu sloupců v tabulce uvedené ve výroku. |
| 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á nástrojem SQLGetDiagRec v vyrovnávací paměti *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. |
| HY008 | Operace byla zrušena. | Asynchronní zpracování bylo povoleno pro StatementHandle. Funkce byla volána a před dokončením provádění byla volána funkce SQLCancel nebo SQLCancelHandle pro PříkazHandle. Pak byla funkce znovu volána v StatementHandle. Funkce byla volána a před dokončením provádění byla volána funkce SQLCancel neboSQLCancelHandlez jiného vlákna v aplikaci s více vlákny. |
| HY010 | Chyba posloupnosti funkcí | (DM) Funkce byla volána před vyvoláním SQLPrepare nebo SQLExecDirect pro CommandHandle. (DM) Byla volána asynchronně spuštěná funkce pro popisovač připojení, který je přidružen k StatementHandle. Tato asynchronní funkce byla stále v běžném provozu, když byla volána funkce SQLDescribeParam . (DM) Pro PříkazHandle byla volána asynchronně spuštěná funkce (ne tato) a při zavolání této funkce se stále spouštěla. (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. |
| 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. |
| 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. |
| IM017 | Dotazování je zakázané v asynchronním režimu oznámení. | Při každém použití modelu oznámení je dotazování zakázané. |
| IM018 | K dokončení předchozí asynchronní operace na tomto popisovači nebyla volána funkce SQLCompleteAsync. | Pokud předchozí volání funkce na popisovači vrátí SQL_STILL_EXECUTING a pokud je povolen režim oznámení, musí být sqlCompleteAsync volán na popisovači, aby bylo možné provést následné zpracování a dokončit operaci. |
Comments
Markery parametrů jsou číslovány v rostoucím pořadí parametrů, počínaje 1, v pořadí, v jakém se objevují v SQL příkazu.
SQLDescribeParam nevrací typ (vstup, vstup/výstup nebo výstup) parametru v SQL příkazu. Kromě volání procedur jsou všechny parametry v SQL příkazech vstupními parametry. Pro určení typu každého parametru ve volání procedury aplikace volá SQLProcedureColumns.
Pro více informací viz Popis parametrů.
Příklad kódu
Následující příklad vyzývá uživatele k zadání SQL příkazu a poté tento příkaz připraví. Dále volá SQLNumParams , aby zjistil, zda příkaz obsahuje nějaké parametry. Pokud příkaz obsahuje parametry, volá SQLDescribeParam pro jejich popis a SQLBindParameter pro jejich vázání. Nakonec uživatele vyzve k zadání hodnot libovolných parametrů a poté vykoná příkaz.
SQLCHAR Statement[100];
SQLSMALLINT NumParams, i, DataType, DecimalDigits, Nullable;
SQLUINTEGER ParamSize;
SQLHSTMT hstmt;
// Prompt the user for a SQL statement and prepare it.
GetSQLStatement(Statement);
SQLPrepare(hstmt, Statement, SQL_NTS);
// Check to see if there are any parameters. If so, process them.
SQLNumParams(hstmt, &NumParams);
if (NumParams) {
// Allocate memory for three arrays. The first holds pointers to buffers in which
// each parameter value will be stored in character form. The second contains the
// length of each buffer. The third contains the length/indicator value for each
// parameter.
SQLPOINTER * PtrArray = (SQLPOINTER *) malloc(NumParams * sizeof(SQLPOINTER));
SQLINTEGER * BufferLenArray = (SQLINTEGER *) malloc(NumParams * sizeof(SQLINTEGER));
SQLINTEGER * LenOrIndArray = (SQLINTEGER *) malloc(NumParams * sizeof(SQLINTEGER));
for (i = 0; i < NumParams; i++) {
// Describe the parameter.
SQLDescribeParam(hstmt, i + 1, &DataType, &ParamSize, &DecimalDigits, &Nullable);
// Call a helper function to allocate a buffer in which to store the parameter
// value in character form. The function determines the size of the buffer from
// the SQL data type and parameter size returned by SQLDescribeParam and returns
// a pointer to the buffer and the length of the buffer.
AllocParamBuffer(DataType, ParamSize, &PtrArray[i], &BufferLenArray[i]);
// Bind the memory to the parameter. Assume that we only have input parameters.
SQLBindParameter(hstmt, i + 1, SQL_PARAM_INPUT, SQL_C_CHAR, DataType, ParamSize,
DecimalDigits, PtrArray[i], BufferLenArray[i],
&LenOrIndArray[i]);
// Prompt the user for the value of the parameter and store it in the memory
// allocated earlier. For simplicity, this function does not check the value
// against the information returned by SQLDescribeParam. Instead, the driver does
// this when the statement is executed.
GetParamValue(PtrArray[i], BufferLenArray[i], &LenOrIndArray[i]);
}
}
// Execute the statement.
SQLExecute(hstmt);
// Process the statement further, such as retrieving results (if any) and closing the
// cursor (if any). Code not shown.
// Free the memory allocated for each parameter and the memory allocated for the arrays
// of pointers, buffer lengths, and length/indicator values.
for (i = 0; i < NumParams; i++) free(PtrArray[i]);
free(PtrArray);
free(BufferLenArray);
free(LenOrIndArray);
Související funkce
| Informace o | Podívejte se |
|---|---|
| Vazba bufferu na parametr | Funkce SQLBindParameter |
| Zrušení zpracování příkazů | SQLCancel – funkce |
| Spuštění připraveného příkazu SQL | FUNKCE SQLExecute |
| Příprava příkazu pro spuštění | Funkce SQLPrepare |