Funkce SQLDescribeParam

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);  
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

Viz také

Referenční rozhraní ODBC API
Soubory hlaviček ODBC