SQLGetFunctions-Funktion

Konformität
Version eingeführt: ODBC 1.0 Standards Compliance: ISO 92

Summary
SQLGetFunctions liefert Informationen darüber, ob ein Treiber eine bestimmte ODBC-Funktion unterstützt. Diese Funktion ist im Driver Manager implementiert; Sie kann auch in Treibern implementiert werden. Wenn ein Treiber SQLGetFunctions implementiert, ruft der Treibermanager die Funktion im Treiber auf. Andernfalls führt er die Funktion selbst aus.

Syntax

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

Argumente

ConnectionHandle
[Eingabe] Verbindungshandle.

FunctionId
[Eingabe] Ein #define Wert, der die wichtige ODBC-Funktion identifiziert; SQL_API_ODBC3_ALL_FUNCTIONS orSQL_API_ALL_FUNCTIONS. SQL_API_ODBC3_ALL_FUNCTIONS wird von einer ODBC 3*.x*-Anwendung verwendet, um die Unterstützung von ODBC 3*.x* und früheren Funktionen zu bestimmen. SQL_API_ALL_FUNCTIONS wird von einer ODBC 2*.x*-Anwendung verwendet, um die Unterstützung von ODBC 2*.x* und früheren Funktionen zu bestimmen.

Eine Liste #define Werte, die ODBC-Funktionen identifizieren, finden Sie in den Tabellen unter "Kommentare".

SupportedPtr
[Ausgabe] Wenn FunctionId eine einzelne ODBC-Funktion identifiziert, zeigt SupportedPtr auf einen einzelnen SQLUSMALLINT-Wert, der SQL_TRUE ist, wenn die angegebene Funktion vom Treiber unterstützt wird, und SQL_FALSE, wenn sie nicht unterstützt wird.

Wenn FunctionId SQL_API_ODBC3_ALL_FUNCTIONS ist, zeigt SupportedPtr auf ein SQLSMALLINT-Array mit einer Anzahl von Elementen gleich SQL_API_ODBC3_ALL_FUNCTIONS_SIZE. Dieses Array wird vom Driver Manager als 4.000-Bitmap behandelt, mit der bestimmt werden kann, ob eine ODBC 3*.x* oder frühere Funktion unterstützt wird. Das SQL_FUNC_EXISTS Makro wird aufgerufen, um die Funktionsunterstützung zu bestimmen. (Siehe "Kommentare.") Eine ODBC 3*.x*-Anwendung kann SQLGetFunctions mit SQL_API_ODBC3_ALL_FUNCTIONS gegen einen ODBC 3*.x* oder ODBC 2*.x*-Treiber aufrufen.

Wenn FunctionId SQL_API_ALL_FUNCTIONS ist, weist SupportedPtr auf ein SQLUSMALLINT-Array von 100 Elementen hin. Das Array wird durch #define Werte indiziert, die von FunctionId zur Identifikation jeder ODBC-Funktion verwendet werden; Einige Elemente des Arrays sind ungenutzt und für die zukünftige Nutzung reserviert. Ein Element ist SQL_TRUE, wenn es eine ODBC 2*.x* oder frühere Funktion identifiziert, die vom Treiber unterstützt wird. Es ist SQL_FALSE, ob sie eine ODBC-Funktion identifiziert, die vom Treiber nicht unterstützt wird, oder keine ODBC-Funktion identifiziert.

Die in *SupportedPtr zurückgegebenen Arrays verwenden nullbasierte Indexierung.

Rücklieferungen

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR oder SQL_INVALID_HANDLE.

Diagnostics

Wenn SQLGetFunctions SQL_ERROR oder SQL_SUCCESS_WITH_INFO zurückgibt, kann ein zugehöriger SQLSTATE-Wert erhalten werden, indem SQLGetDiagRec mit einem HandleType von SQL_HANDLE_DBC und einem Handle von ConnectionHandle aufgerufen wird. Die folgende Tabelle listet die SQLSTATE-Werte auf, die häufig von SQLGetFunctions zurückgegeben werden, und erklärt jeden einzelnen im Kontext dieser Funktion; die Notation "(DM)" geht den vom Treibermanager zurückgegebenen SQLSTATE-Beschreibungen voraus. Der rückgabecode, der jedem SQLSTATE-Wert zugeordnet ist, ist SQL_ERROR, sofern nicht anders angegeben.

SQLSTATE Fehler Description
01000 Allgemeiner Warnhinweis Treiberspezifische Informationsmeldung. (Funktion gibt SQL_SUCCESS_WITH_INFO zurück.)
08S01 Kommunikationslinkfehler Die Kommunikationsverbindung zwischen dem Treiber und der Datenquelle, mit der der Treiber verbunden wurde, ist fehlgeschlagen, bevor die Verarbeitung der Funktion abgeschlossen wurde.
HY000 Allgemeiner Fehler Es ist ein Fehler aufgetreten, für den kein spezifischer SQLSTATE-Wert vorhanden war und für den keine implementierungsspezifische SQLSTATE definiert wurde. Die von SQLGetDiagRec im *MessageText-Puffer zurückgegebene Fehlermeldung beschreibt den Fehler und dessen Ursache.
HY001 Speicherzuweisungsfehler Der Treiber konnte speicher nicht zuordnen, der erforderlich ist, um die Ausführung oder den Abschluss der Funktion zu unterstützen.
HY010 Funktionssequenzfehler (DM) SQLGetFunctions wurde vor SQLConnect, SQLBrowseConnect oder SQLDriverConnect genannt.

(DM) SQLBrowseConnect wurde für den ConnectionHandle aufgerufen und SQL_NEED_DATA zurückgegeben. Diese Funktion wurde aufgerufen, bevor SQLBrowseConnect SQL_SUCCESS_WITH_INFO oder SQL_SUCCESS zurückgab.

(DM) SQLExecute, SQLExecDirect oder SQLMoreResults wurde für den ConnectionHandle aufgerufen und SQL_PARAM_DATA_AVAILABLE zurückgegeben. Diese Funktion wurde aufgerufen, bevor Daten für alle gestreamten Parameter abgerufen wurden.
HY013 Speicherverwaltungsfehler Der Funktionsaufruf konnte nicht verarbeitet werden, da auf die zugrunde liegenden Speicherobjekte nicht zugegriffen werden konnte, möglicherweise aufgrund geringer Arbeitsspeicherbedingungen.
HY095 Funktionstyp außerhalb des Bereichs (DM) Ein ungültiger FunctionId-Wert wurde angegeben.
HY117 Die Verbindung wird aufgrund des unbekannten Transaktionsstatus angehalten. Es sind nur Trenn- und schreibgeschützte Funktionen zulässig. (DM) Weitere Informationen zum angehaltenen Zustand finden Sie unter SQLEndTran Function.
HYT01 Verbindungstimeout abgelaufen Der Zeitraum für das Verbindungstimeout ist abgelaufen, bevor die Datenquelle auf die Anforderung geantwortet hat. Der Verbindungstimeoutzeitraum wird über SQLSetConnectAttr SQL_ATTR_CONNECTION_TIMEOUT festgelegt.

Kommentare

SQLGetFunctions gibt immer an, dass SQLGetFunctions, SQLDataSources und SQLDrivers unterstützt werden. Dies geschieht, weil diese Funktionen im Driver Manager implementiert sind. Der Treibermanager bildet eine ANSI-Funktion auf die entsprechende Unicode-Funktion ab, falls die Unicode-Funktion existiert, und bildet eine Unicode-Funktion auf die entsprechende ANSI-Funktion ab, wenn die ANSI-Funktion existiert. Informationen darüber, wie Anwendungen SQLGetFunctions verwenden, finden Sie unter Interface Conformance Levels.

Im Folgenden finden Sie eine Liste gültiger Werte für FunctionId für Funktionen, die dem ISO-92-Standard-Compliance-Level entsprechen:

FunctionId-Wert FunctionId-Wert
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

Im Folgenden findet sich eine Liste gültiger Werte für FunctionId für Funktionen, die dem Open Group-Standard-Compliance-Level entsprechen:

FunctionId-Wert FunctionId-Wert
SQL_API_SQLCOLUMNS SQL_API_SQLSTATISTICS
SQL_API_SQLSPECIALCOLUMNS SQL_API_SQLTABLES

Im Folgenden findet sich eine Liste gültiger Werte für FunctionId für Funktionen, die dem ODBC-Standard-Compliance-Level entsprechen.

FunctionId-Wert FunctionId-Wert
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] Bei der Arbeit mit einem ODBC 2*.x*-Treiber wird SQLBulkOperations nur dann als unterstützt zurückgegeben, wenn beide Folgen zutreffen: Der ODBC 2*.x*-Treiber unterstützt SQLSetPos, und der Informationstyp SQL_POS_OPERATIONS gibt das SQL_POS_ADD Bit wie festgelegt zurück.

Im Folgenden eine Liste gültiger Werte für FunctionId für Funktionen, die in ODBC 3.8 oder später eingeführt wurden:

FunctionId-Wert
SQL_API_SQLCANCELHANDLE [2]

[2] SQLCancelHandle wird nur dann als unterstützt zurückgegeben, wenn der Treiber sowohl SQLCancel als auch SQLCancelHandle unterstützt. Wenn SQLCancel unterstützt wird, SQLCancelHandle jedoch nicht, kann die Anwendung weiterhin SQLCancelHandle auf einem Anweisungshandle aufrufen, da dieser auf SQLCancel abgebildet wird.

SQL_FUNC_EXISTS Makro

Das Makro SQL_FUNC_EXISTS(SupportedPtr, FunctionID) wird verwendet, um die Unterstützung von ODBC 3*.x* oder früheren Funktionen zu bestimmen, nachdem SQLGetFunctions mit einem FunctionId-Argument von SQL_API_ODBC3_ALL_FUNCTIONS aufgerufen wurde. Die Anwendung ruft SQL_FUNC_EXISTS auf, wobei das Supported Ptr-Argument auf das in SQLGetFunctions übergegebene SupportedPtr gesetzt ist und das Argumente FunctionID auf das #define der Funktion gesetzt ist. SQL_FUNC_EXISTS gibt SQL_TRUE zurück, wenn die Funktion unterstützt wird, und SQL_FALSE anderweitig.

Note

Bei der Arbeit mit einem ODBC 2*.x*-Treiber gibt der ODBC 3*.x* Driver Manager SQL_TRUE für SQLAllocHandle und SQLFreeHandle zurück, da SQLAllocHandle auf SQLAllocEnv, SQLAllocConnect oder SQLAllocStmt abgebildet ist und SQLFreeHandle auf SQLFreeEnv, SQLFreeConnect oder SQLFreeStmt abgebildet ist. SQLAllocHandle oder SQLFreeHandle mit einem HandleType-Argument von SQL_HANDLE_DESC werden jedoch nicht unterstützt, obwohl SQL_TRUE für die Funktionen zurückgegeben wird, da es in diesem Fall keine ODBC 2*.x*-Funktion gibt, auf die man abbilden könnte.

Codebeispiel

Die folgenden drei Beispiele zeigen, wie eine Anwendung SQLGetFunctions verwendet, um zu bestimmen, ob ein Treiber SQLTables, SQLColumns und SQLStatistics unterstützt. Wenn der Treiber diese Funktionen nicht unterstützt, trennt sich die Anwendung vom Treiber. Das erste Beispiel ruft SQLGetFunctions einmal für jede Funktion auf.

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

Im zweiten Beispiel ruft eine ODBC 3.x-Anwendung SQLGetFunctions auf und übergibt ihr ein Array, in dem SQLGetFunctions Informationen über alle ODBC 3.x- und früheren Funktionen zurückgibt.

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

Das dritte Beispiel ist eine ODBC 2.x-Anwendung, die SQLGetFunctions aufruft und ihr ein Array von 100 Elementen übergibt, in denen SQLGetFunctions Informationen über alle ODBC 2.x- und früheren Funktionen zurückgibt.

#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);  
Weitere Informationen zu Siehe
Zurückgeben der Einstellung eines Verbindungsattributes SQLGetConnectAttr-Funktion
Rückgabe von Informationen über einen Treiber oder eine Datenquelle SQLGetInfo-Funktion
Zurückgeben der Einstellung eines Anweisungsattributs SQLGetStmtAttr-Funktion