SQLDescribeParam-functie

Conformiteit
Versie geïntroduceerd: ODBC 1.0 Standaardnaleving: ODBC

Samenvatting
SQLDescribeParam geeft de beschrijving terug van een parametermarker die is gekoppeld aan een voorbereide SQL-instructie. Deze informatie is ook beschikbaar in de velden van de IPD.

Syntax

  
SQLRETURN SQLDescribeParam(  
      SQLHSTMT        StatementHandle,  
      SQLUSMALLINT    ParameterNumber,  
      SQLSMALLINT *   DataTypePtr,  
      SQLULEN *       ParameterSizePtr,  
      SQLSMALLINT *   DecimalDigitsPtr,  
      SQLSMALLINT *   NullablePtr);  

Arguments

StatementHandle
[Invoer] Instructiehandgreep.

ParameterNumber
[Invoer] Parametermarkernummer opeenvolgend gerangschikt in toenemende parametervolgorde, beginnend bij 1.

DataTypePtr
[Output] Wijs naar een buffer waarin het SQL-datatype van de parameter wordt teruggegeven. Deze waarde wordt gelezen uit het SQL_DESC_CONCISE_TYPE recordveld van de IPD. Dit zal een van de waarden zijn in de sectie SQL Data Types van Appendix D: Data Types, of een driver-specifiek SQL-datatype.

In ODBC 3. x, SQL_TYPE_DATE, SQL_TYPE_TIME of SQL_TYPE_TIMESTAMP worden respectievelijk teruggegeven in *DataTypePtr voor datum-, tijd- of tijdstempelgegevens; in ODBC 2. X, SQL_DATE, SQL_TIME of SQL_TIMESTAMP worden teruggegeven. De Driver Manager voert de vereiste mappings uit wanneer een ODBC 2 is. x applicatie werkt met een ODBC 3. x driver of wanneer een ODBC 3. x-applicatie werkt met een ODBC 2. X-bestuurder .

Wanneer ColumnNumber gelijk is aan 0 (voor een bladwijzerkolom), wordt SQL_BINARY teruggegeven in *DataTypePtr voor bladwijzers van variabele lengte. (SQL_INTEGER wordt teruggegeven als bladwijzers worden gebruikt door een ODBC 3. x applicatie die werkt met een ODBC 2. x driver of door een ODBC 2. x applicatie die werkt met een ODBC 3. X-bestuurder .)

Voor meer informatie, zie SQL Data Types in Appendix D: Data Types. Zie de documentatie van het stuurprogramma voor informatie over stuurprogrammaspecifieke SQL-gegevenstypen.

ParameterSizePtr
[Output] Wijs naar een buffer waarin de grootte, in tekens, van de kolom of expressie van de overeenkomstige parametermarker zoals gedefinieerd door de databron wordt teruggegeven. Voor meer informatie over kolomgrootte, zie Kolomgrootte, Decimale cijfers, Overdracht van de octelengte en Weergavegrootte.

DecimalDigitsPtr
[Output] Richt op een buffer waarin het aantal decimale cijfers van de kolom of uitdrukking van de overeenkomstige parameter wordt teruggegeven zoals gedefinieerd door de databron. Voor meer informatie over decimale cijfers, zie Kolomgrootte, Decimale cijfers, Transfer Octet Length en Display Size.

NullablePtr
[Output] Wijs naar een buffer waarin een waarde wordt teruggegeven die aangeeft of de parameter NULL-waarden toestaat. Deze waarde wordt gelezen uit het SQL_DESC_NULLABLE veld van de IPD. Een van de volgende:

  • SQL_NO_NULLS: De parameter staat geen NULL-waarden toe (dit is de standaardwaarde).

  • SQL_NULLABLE: De parameter staat NULL-waarden toe.

  • SQL_NULLABLE_UNKNOWN: De driver kan niet bepalen of de parameter NULL-waarden toestaat.

Returns

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_ERROR of SQL_INVALID_HANDLE.

Diagnostics

Wanneer SQLDescribeParam SQL_ERROR of SQL_SUCCESS_WITH_INFO teruggeeft, kan een bijbehorende SQLSTATE-waarde worden verkregen door SQLGetDiagRec aan te roepen met een HandleType van SQL_HANDLE_STMT en een Handle van StatementHandle. De volgende tabel geeft een overzicht van de SQLSTATE-waarden die typisch door SQLDescribeParam worden geretourneerd en legt elk uit in de context van deze functie; de notatie "(DM)" gaat vooraf aan de beschrijvingen van SQLSTATES die door de Driver Manager worden teruggegeven. De retourcode die is gekoppeld aan elke SQLSTATE-waarde is SQL_ERROR, tenzij anders vermeld.

SQLSTATE Fout Description
01000 Algemene waarschuwing Stuurprogrammaspecifiek informatiebericht. (Functie retourneert SQL_SUCCESS_WITH_INFO.)
07009 Ongeldige descriptorindex (DM) De waarde die voor het argument ParameterNumber is gespecificeerd is kleiner dan 1.

De waarde die voor het argument ParameterNumber werd gespecificeerd, was groter dan het aantal parameters in de bijbehorende SQL-instructie.

De parametermarker maakte deel uit van een niet-DML-statement.

De parametermarker maakte deel uit van een SELECT-lijst .
08S01 Communicatiekoppelingsfout De communicatiekoppeling tussen het stuurprogramma en de gegevensbron waarmee het stuurprogramma is verbonden, is mislukt voordat de verwerking van de functie is voltooid.
21S01 Lijst met waarden invoegen komt niet overeen met de kolomlijst Het aantal parameters in de INSERT verklaring kwam niet overeen met het aantal kolommen in de tabel die in de verklaring werd genoemd.
HY000 Algemene fout Er is een fout opgetreden waarvoor er geen specifieke SQLSTATE is en waarvoor geen implementatiespecifieke SQLSTATE is gedefinieerd. Het foutbericht dat door SQLGetDiagRec in de *MessageText-buffer wordt geretourneerd, beschrijft de fout en de oorzaak ervan.
HY001 Fout bij geheugentoewijzing Het stuurprogramma kan geen geheugen toewijzen dat vereist is om de uitvoering of voltooiing van de functie te ondersteunen.
HY008 Bewerking geannuleerd Asynchrone verwerking is ingeschakeld voor de StatementHandle. De functie is aangeroepen en voordat de uitvoering is voltooid, werd SQLCancel of SQLCancelHandle aangeroepen op de StatementHandle. Vervolgens werd de functie opnieuw aangeroepen op de StatementHandle.

De functie is aangeroepen en voordat de uitvoering is voltooid, werd SQLCancel of SQLCancelHandle aangeroepen op de StatementHandle vanuit een andere thread in een multithread-toepassing.
HY010 Fout in functiereeks (DM) De functie werd aangeroepen voordat SQLPrepare of SQLExecDirect werd aangeroepen voor de StatementHandle.

(DM) Er is een asynchroon uitgevoerde functie aangeroepen voor de verbindingsgreep die is gekoppeld aan de StatementHandle. Deze asynchrone functie werd nog uitgevoerd toen de SQLDescribeParam-functie werd aangeroepen.

(DM) Er is een asynchroon uitgevoerde functie (niet deze) aangeroepen voor de StatementHandle en werd nog steeds uitgevoerd toen deze functie werd aangeroepen.

(DM) SQLExecute, SQLExecDirect, SQLBulkOperations of SQLSetPos werd aangeroepen voor de StatementHandle en geretourneerd SQL_NEED_DATA. Deze functie is aangeroepen voordat gegevens werden verzonden voor alle parameters of kolommen voor uitvoering van gegevens.
HY013 Fout bij geheugenbeheer De functie-aanroep kan niet worden verwerkt omdat de onderliggende geheugenobjecten niet kunnen worden geopend, mogelijk vanwege weinig geheugen.
HY117 De verbinding is onderbroken vanwege een onbekende transactiestatus. Alleen de verbinding verbreken en alleen-lezenfuncties zijn toegestaan. (DM) Zie SQLEndTran Function voor meer informatie over de onderbroken status.
HYT01 Time-out voor de verbinding is overschreden De time-outperiode voor de verbinding is verlopen voordat de gegevensbron op de aanvraag heeft gereageerd. De time-outperiode voor de verbinding wordt ingesteld via SQLSetConnectAttr, SQL_ATTR_CONNECTION_TIMEOUT.
IM001 Stuurprogramma biedt geen ondersteuning voor deze functie (DM) Het stuurprogramma dat is gekoppeld aan de StatementHandle biedt geen ondersteuning voor de functie.
IM017 Polling is uitgeschakeld in de asynchrone meldingsmodus Wanneer het meldingsmodel wordt gebruikt, wordt polling uitgeschakeld.
IM018 SQLCompleteAsync is niet aangeroepen om de vorige asynchrone bewerking op deze ingang te voltooien. Als de vorige functieaanroep op de ingang SQL_STILL_EXECUTING retourneert en als de meldingsmodus is ingeschakeld, moet SQLCompleteAsync worden aangeroepen op de ingang om naverwerking te kunnen uitvoeren en de bewerking te voltooien.

Comments

Parametermarkers worden genummerd in toenemende parametervolgorde, beginnend met 1, in de volgorde waarin ze in de SQL-instructie voorkomen.

SQLDescribeParam geeft het type (input, input/output of output) van een parameter in een SQL-instructie niet terug. Behalve bij aanroepen van procedures zijn alle parameters in SQL-statements invoerparameters. Om het type van elke parameter in een aanroep van een procedure te bepalen, roept een applicatie SQLProcedureColumns aan.

Voor meer informatie, zie Parameters beschrijven.

Codevoorbeeld

Het volgende voorbeeld vraagt de gebruiker om een SQL-instructie en bereidt die vervolgens voor. Vervolgens roept het SQLNumParams aan om te bepalen of de instructie parameters bevat. Als de instructie parameters bevat, roept het SQLDescribeParam aan om die parameters te beschrijven en SQLBindParameter om ze te binden. Ten slotte vraagt het de gebruiker om de waarden van eventuele parameters en voert vervolgens de instructie uit.

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);  
Voor informatie over Zien!
Een buffer binden aan een parameter SQLBindParameter-functie
Verwerking van instructie annuleren SQLCancel, functie
Een voorbereide SQL-instructie uitvoeren SQLExecute, functie
Een instructie voorbereiden voor uitvoering SQLPrepare, functie

Zie ook

ODBC-API-verwijzing
ODBC-headerbestanden