Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Ö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);
Relaterade funktioner
| 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 |