SQLGetFunctions-funktion

Överensstämmelse
Version introducerad: ODBC 1.0 Standardefterlevnad: ISO 92

Summary
SQLGetFunctions returnerar information om huruvida en drivrutin stöder en specifik ODBC-funktion. Denna funktion implementeras i Driver Manager; Det kan också implementeras i drivrutiner. Om en drivrutin implementerar SQLGetFunctions anropar Driver Manager funktionen i drivrutinen. Annars utför den funktionen själv.

Syntax

  
SQLRETURN SQLGetFunctions(  
     SQLHDBC           ConnectionHandle,  
     SQLUSMALLINT      FunctionId,  
     SQLUSMALLINT *    SupportedPtr);  

Arguments

ConnectionHandle
Indata: Anslutningshandtag.

FunctionId
[Input] Ett #define värde som identifierar den aktuella ODBC-funktionen; SQL_API_ODBC3_ALL_FUNCTIONS orSQL_API_ALL_FUNCTIONS. SQL_API_ODBC3_ALL_FUNCTIONS används av en ODBC 3*.x*-applikation för att avgöra stöd för ODBC 3*.x* och tidigare funktioner. SQL_API_ALL_FUNCTIONS används av en ODBC 2*.x*-applikation för att bestämma stöd för ODBC 2*.x* och tidigare funktioner.

För en lista över #define värden som identifierar ODBC-funktioner, se tabellerna under "Kommentarer."

SupportedPtr
[Utdata] Om FunctionId identifierar en enda ODBC-funktion pekar SupportedPtr på ett enda SQLUSMALLINT-värde som är SQL_TRUE om den specificerade funktionen stöds av drivrutinen, och SQL_FALSE om den inte stöds.

Om FunctionId är SQL_API_ODBC3_ALL_FUNCTIONS pekar SupportedPtr på en SQLSMALLINT-array med ett antal element lika med SQL_API_ODBC3_ALL_FUNCTIONS_SIZE. Denna array behandlas av Driver Manager som en 4 000-bitars bitmap som kan användas för att avgöra om en ODBC 3*.x* eller tidigare funktion stöds. Det SQL_FUNC_EXISTS makro anropas för att bestämma funktionsstöd. (Se "Kommentarer.") En ODBC 3*.x*-applikation kan anropa SQLGetFunctions med SQL_API_ODBC3_ALL_FUNCTIONS mot antingen en ODBC 3*.x* eller ODBC 2*.x*-drivrutin.

Om FunctionId är SQL_API_ALL_FUNCTIONS pekar SupportedPtr på en SQLUSMALLINT-array med 100 element. Matrisen indexeras med #define värden som används av FunctionId för att identifiera varje ODBC-funktion; vissa delar av arrayen används inte och är reserverade för framtida bruk. Ett element SQL_TRUE om det identifierar en ODBC 2*.x* eller tidigare funktion som stöds av drivrutinen. Det är SQL_FALSE om den identifierar en ODBC-funktion som inte stöds av drivrutinen eller inte identifierar en ODBC-funktion.

Arrayerna som returneras i *SupportedPtr använder nollbaserad indexering.

Returns

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR eller SQL_INVALID_HANDLE.

Diagnostics

När SQLGetFunctions returnerar SQL_ERROR eller SQL_SUCCESS_WITH_INFO kan ett associerat SQLSTATE-värde erhållas genom att anropa SQLGetDiagRec med HandleType av SQL_HANDLE_DBC och ett Handle av ConnectionHandle. Följande tabell listar de SQLSTATE-värden som vanligtvis returneras av SQLGetFunctions och förklarar var och en i kontexten av denna funktion; notationen "(DM)" föregår beskrivningarna av SQLSTATE som returneras av Driver Manager. Returkoden som är associerad med varje SQLSTATE-värde är SQL_ERROR, om inget annat anges.

SQLSTATE Error Description
01000 Allmän varning Informationsmeddelande för drivrutinsspecifikt. (Funktionen returnerar SQL_SUCCESS_WITH_INFO.)
08S01 Kommunikationslänkfel Kommunikationslänken mellan drivrutinen och datakällan som drivrutinen var ansluten till misslyckades innan funktionen slutförde bearbetningen.
HY000 Allmänt fel Ett fel uppstod för vilket det inte fanns någon specifik SQLSTATE och för vilken ingen implementeringsspecifik SQLSTATE definierades. Felmeddelandet som returnerades av SQLGetDiagRec i *MessageText-bufferten beskriver felet och dess orsak.
HY001 Fel vid minnesallokering Drivrutinen kunde inte allokera minne som krävs för körning eller slutförande av funktionen.
HY010 Funktionssekvensfel (DM) SQLGetFunctions kallades före SQLConnect, SQLBrowseConnect eller SQLDriverConnect.

(DM) SQLBrowseConnect anropades för ConnectionHandle och returnerades SQL_NEED_DATA. Denna funktion anropades innan SQLBrowseConnect returnerade SQL_SUCCESS_WITH_INFO eller SQL_SUCCESS.

(DM) SQLExecute, SQLExecDirect eller SQLMoreResults anropades för ConnectionHandle och returnerades SQL_PARAM_DATA_AVAILABLE. Den här funktionen anropades innan data hämtades för alla strömmade parametrar.
HY013 Minneshanteringsfel Det gick inte att bearbeta funktionsanropet eftersom det inte gick att komma åt underliggande minnesobjekt, möjligen på grund av minnesbrist.
HY095 Funktionstyp utanför räckvidden (DM) Ett ogiltigt FunctionId-värde angavs.
HY117 Anslutningen pausas på grund av okänt transaktionstillstånd. Endast frånkopplings- och skrivskyddade funktioner tillåts. (DM) Mer information om pausat tillstånd finns i SQLEndTran-funktion.
HYT01 Tidsgränsen för anslutningen gick ut Tidsgränsen för anslutningen löpte ut innan datakällan svarade på begäran. Tidsgränsen för anslutningen anges via SQLSetConnectAttr, SQL_ATTR_CONNECTION_TIMEOUT.

Comments

SQLGetFunctions anger alltid att SQLGetFunctions, SQLDataSources och SQLDrivers stöds. Detta görs eftersom dessa funktioner är implementerade i Driver Manager. Driver Manager kommer att mappa en ANSI-funktion till motsvarande Unicode-funktion om Unicode-funktionen finns och kommer att mappa en Unicode-funktion till motsvarande ANSI-funktion om ANSI-funktionen finns. För information om hur applikationer använder SQLGetFunctions, se Gränssnittskonformitetsnivåer.

Följande är en lista över giltiga värden för FunctionId för funktioner som uppfyller ISO 92:s standarduppfyllelsenivå:

FunctionId-värde FunctionId-värde
SQL_API_SQLALLOCHANDLE SQL_API_SQLGETDESCFIELD
SQL_API_SQLBINDCOL SQL_API_SQLGETDESCREC
SQL_API_SQLCANCEL SQL_API_SQLGETDIAGFIELD
SQL_API_SQLCLOSECURSOR SQL_API_SQLGETDIAGREC
SQL_API_SQLCOLATTRIBUTE SQL_API_SQLGETENVATTR
SQL_API_SQLCONNECT SQL_API_SQLGETFUNCTIONS
SQL_API_SQLCOPYDESC SQL_API_SQLGETINFO
SQL_API_SQLDATASOURCES SQL_API_SQLGETSTMTATTR
SQL_API_SQLDESCRIBECOL SQL_API_SQLGETTYPEINFO
SQL_API_SQLDISCONNECT SQL_API_SQLNUMRESULTCOLS
SQL_API_SQLDRIVERS SQL_API_SQLPARAMDATA
SQL_API_SQLENDTRAN SQL_API_SQLPREPARE
SQL_API_SQLEXECDIRECT SQL_API_SQLPUTDATA
SQL_API_SQLEXECUTE SQL_API_SQLROWCOUNT
SQL_API_SQLFETCH SQL_API_SQLSETCONNECTATTR
SQL_API_SQLFETCHSCROLL SQL_API_SQLSETCURSORNAME
SQL_API_SQLFREEHANDLE SQL_API_SQLSETDESCFIELD
SQL_API_SQLFREESTMT SQL_API_SQLSETDESCREC
SQL_API_SQLGETCONNECTATTR SQL_API_SQLSETENVATTR
SQL_API_SQLGETCURSORNAME SQL_API_SQLSETSTMTATTR
SQL_API_SQLGETDATA

Följande är en lista över giltiga värden för FunctionId för funktioner som uppfyller Open Group-standardefterlevnadsnivån:

FunctionId-värde FunctionId-värde
SQL_API_SQLCOLUMNS SQL_API_SQLSTATISTICS
SQL_API_SQLSPECIALCOLUMNS SQL_API_SQLTABLES

Följande är en lista över giltiga värden för FunctionId för funktioner som uppfyller ODBC:s standardefterlevnadsnivå.

FunctionId-värde FunctionId-värde
SQL_API_SQLBINDPARAMETER SQL_API_SQLNATIVESQL
SQL_API_SQLBROWSECONNECT SQL_API_SQLNUMPARAMS
SQL_API_SQLBULKOPERATIONS[1] SQL_API_SQLPRIMARYKEYS
SQL_API_SQLCOLUMNPRIVILEGES SQL_API_SQLPROCEDURECOLUMNS
SQL_API_SQLDESCRIBEPARAM SQL_API_SQLPROCEDURES
SQL_API_SQLDRIVERCONNECT SQL_API_SQLSETPOS
SQL_API_SQLFOREIGNKEYS SQL_API_SQLTABLEPRIVILEGES
SQL_API_SQLMORERESULTS

[1] När man arbetar med en ODBC 2*.x*-drivrutin returneras SQLBulkOperations som stödd endast om båda följande är sanna: ODBC 2*.x*-drivrutinen stöder SQLSetPos, och informationstypen SQL_POS_OPERATIONS returnerar den SQL_POS_ADD biten som satt.

Följande är en lista över giltiga värden för FunctionId för funktioner som introducerades i ODBC 3.8 eller senare:

FunctionId-värde
SQL_API_SQLCANCELHANDLE [2]

[2] SQLCancelHandle returneras som stödd endast om drivrutinen stöder både SQLCancel och SQLCancelHandle. Om SQLCancel stöds men SQLCancelHandle inte gör det, kan applikationen fortfarande anropa SQLCancelHandle på ett satshandtag, eftersom det kommer att mappas till SQLCancel.

SQL_FUNC_EXISTS Makro

Makrot SQL_FUNC_EXISTS(SupportedPtr, FunctionID) används för att bestämma stöd för ODBC 3*.x* eller tidigare funktioner efter att SQLGetFunctions har anropats med ett FunctionId-argument SQL_API_ODBC3_ALL_FUNCTIONS. Applikationen anropar SQL_FUNC_EXISTS med argumentet SupportedPtr satt till SupportedPtr som skickas i SQLGetFunctions, och med argumentet FunctionID inställt på #define för funktionen. SQL_FUNC_EXISTS returnerar SQL_TRUE om funktionen stöds, och SQL_FALSE annars.

Note

När man arbetar med en ODBC 2*.x*-drivrutin kommer ODBC 3*.x* Driver Manager att returnera SQL_TRUE för SQLAllocHandle och SQLFreeHandle eftersom SQLAllocHandle är mappad till SQLAllocEnv, SQLAllocConnect eller SQLAllocStmt, och eftersom SQLFreeHandle är mappad till SQLFreeEnv, SQLFreeConnect eller SQLFreeStmt. SQLAllocHandle eller SQLFreeHandle med ett HandleType-argument SQL_HANDLE_DESC stöds dock inte, även om SQL_TRUE returneras för funktionerna, eftersom det inte finns någon ODBC 2*.x*-funktion att mappa till i detta fall.

Kodexempel

Följande tre exempel visar hur en applikation använder SQLGetFunctions för att avgöra om en drivrutin stödjer SQLTables, SQLColumns och SQLStatistics. Om drivrutinen inte stödjer dessa funktioner kopplas applikationen bort från drivrutinen. Det första exemplet anropar SQLGetFunctions en gång för varje funktion.

SQLUSMALLINT TablesExists, ColumnsExists, StatisticsExists;  
RETCODE retcodeTables, retcodeColumns, retcodeStatistics  
  
retcodeTables = SQLGetFunctions(hdbc, SQL_API_SQLTABLES, &TablesExists);  
retcodeColumns = SQLGetFunctions(hdbc, SQL_API_SQLCOLUMNS, &ColumnsExists);  
retcodeStatistics = SQLGetFunctions(hdbc, SQL_API_SQLSTATISTICS, &StatisticsExists);  
  
// SQLGetFunctions is completed successfully and SQLTables, SQLColumns, and SQLStatistics are supported by the driver.  
if (retcodeTables == SQL_SUCCESS && TablesExists == SQL_TRUE &&   
retcodeColumns == SQL_SUCCESS && ColumnsExists == SQL_TRUE &&   
retcodeStatistics == SQL_SUCCESS && StatisticsExists == SQL_TRUE)   
{  
  
   // Continue with application  
  
}  
  
SQLDisconnect(hdbc);  

I det andra exemplet anropar en ODBC 3.x-applikation SQLGetFunctions och skickar en array där SQLGetFunctions returnerar information om alla ODBC 3.x och tidigare funktioner.

RETCODE retcodeTables, retcodeColumns, retcodeStatistics  
SQLUSMALLINT fExists[SQL_API_ODBC3_ALL_FUNCTIONS_SIZE];  
  
retcode = SQLGetFunctions(hdbc, SQL_API_ODBC3_ALL_FUNCTIONS, fExists);  
  
// SQLGetFunctions is completed successfully and SQLTables, SQLColumns, and SQLStatistics are supported by the driver.  
if (retcode == SQL_SUCCESS &&   
SQL_FUNC_EXISTS(fExists, SQL_API_SQLTABLES) == SQL_TRUE &&  
   SQL_FUNC_EXISTS(fExists, SQL_API_SQLCOLUMNS) == SQL_TRUE &&  
   SQL_FUNC_EXISTS(fExists, SQL_API_SQLSTATISTICS) == SQL_TRUE)   
{  
  
   // Continue with application  
  
}  
  
SQLDisconnect(hdbc);  

Det tredje exemplet är en ODBC 2.x-applikation som anropar SQLGetFunctions och skickar en array med 100 element där SQLGetFunctions returnerar information om alla ODBC 2.x- och tidigare funktioner.

#define FUNCTIONS 100  
  
RETCODE retcodeTables, retcodeColumns, retcodeStatistics  
SQLUSMALLINT fExists[FUNCTIONS];  
  
retcode = SQLGetFunctions(hdbc, SQL_API_ALL_FUNCTIONS, fExists);  
  
/* SQLGetFunctions is completed successfully and SQLTables, SQLColumns, and SQLStatistics are supported by the driver. */  
if (retcode == SQL_SUCCESS &&   
fExists[SQL_API_SQLTABLES] == SQL_TRUE &&  
   fExists[SQL_API_SQLCOLUMNS] == SQL_TRUE &&  
   fExists[SQL_API_SQLSTATISTICS] == SQL_TRUE)   
{  
  
   /* Continue with application */  
  
}  
  
SQLDisconnect(hdbc);  
Mer information om Se
Returnera inställningen för ett anslutningsattribut SQLGetConnectAttr-funktion
Returnera information om en drivrutin eller datakälla SQLGetInfo-funktionen
Returnera inställningen för ett instruktionsattribut SQLGetStmtAttr-funktion