Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Zgodność
Wersja wprowadzona: Zgodność ze standardami ODBC 1.0: ISO 92
Podsumowanie
SQLGetFunctions zwraca informację o tym, czy dany sterownik obsługuje konkretną funkcję ODBC. Funkcja ta jest implementowana w Driver Managerze; Może być również implementowany w sterownikach. Jeśli sterownik implementuje SQLGetFunctions, Driver Manager wywołuje tę funkcję w sterowniku. W przeciwnym razie sam wykonuje tę funkcję.
Syntax
SQLRETURN SQLGetFunctions(
SQLHDBC ConnectionHandle,
SQLUSMALLINT FunctionId,
SQLUSMALLINT * SupportedPtr);
Arguments
ConnectionHandle
[Dane wejściowe] Uchwyt połączenia.
FunctionId
[Input] Wartość #define , która identyfikuje interesującą funkcję ODBC; SQL_API_ODBC3_ALL_FUNCTIONS orSQL_API_ALL_FUNCTIONS.
SQL_API_ODBC3_ALL_FUNCTIONS jest używany przez aplikację ODBC 3*.x* do określenia wsparcia funkcji ODBC 3*.x* i wcześniejszych.
SQL_API_ALL_FUNCTIONS jest używany przez aplikację ODBC 2*.x* do określenia wsparcia dla funkcji ODBC 2*.x* i wcześniejszych.
Listę wartości #define identyfikujących funkcje ODBC znajdziesz w tabelach w sekcji "Komentarze".
SupportedPtr
[Wyjście] Jeśli FunctionId identyfikuje pojedynczą funkcję ODBC, SupportedPtr wskazuje na jedną wartość SQLUSMALLINT, która jest SQL_TRUE, jeśli dana funkcja jest obsługiwana przez sterownik, a SQL_FALSE, jeśli nie jest obsługiwana.
Jeśli FunctionId jest SQL_API_ODBC3_ALL_FUNCTIONS, SupportedPtr wskazuje tablicę SQLSMALLINT z liczbą elementów równą SQL_API_ODBC3_ALL_FUNCTIONS_SIZE. Ta tablica jest traktowana przez Driver Manager jako bitmapa o długości 4 000 bitów, która może być użyta do określenia, czy obsługiwana jest funkcja ODBC 3*.x* lub wcześniejsza. Makro SQL_FUNC_EXISTS jest wywoływane do określenia wsparcia funkcji. (Zobacz "Komentarze.") Aplikacja ODBC 3*.x* może wywołać SQLGetFunctions z SQL_API_ODBC3_ALL_FUNCTIONS przeciwko sterownikowi ODBC 3*.x* lub ODBC 2*.x*.
Jeśli FunctionId jest SQL_API_ALL_FUNCTIONS, SupportedPtr wskazuje na tablicę SQLUSMALLINT składającą się ze 100 elementów. Tablica jest indeksowana przez #define wartości używane przez FunctionId do identyfikacji każdej funkcji ODBC; niektóre elementy tablicy są nieużywane i zarezerwowane na przyszłość. Element jest SQL_TRUE, jeśli identyfikuje funkcję ODBC 2*.x* lub starszą obsługiwaną przez sterownik. Jest SQL_FALSE, jeśli identyfikuje funkcję ODBC nieobsługiwaną przez sterownik lub nie identyfikuje funkcji ODBC.
Tablice zwracane w *SupportedPtr wykorzystują indeksowanie oparte na zerze.
Zwroty
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR lub SQL_INVALID_HANDLE.
Diagnostyka
Gdy SQLGetFunctions zwraca SQL_ERROR lub SQL_SUCCESS_WITH_INFO, można uzyskać powiązaną wartość SQLGetDiagRec, wywołując SQLGetDiagRec z HandleType SQL_HANDLE_DBC oraz HandleConnectionHandle. Poniższa tabela przedstawia wartości SQLSTATE najczęściej zwracane przez SQLGetFunctions i wyjaśnia każdą z nich w kontekście tej funkcji; notacja "(DM)" poprzedza opisy stanów SQL zwracanych przez Menedżera Sterowników. Kod zwracany skojarzony z każdą wartością SQLSTATE jest SQL_ERROR, chyba że określono inaczej.
| SQLSTATE | Error | Description |
|---|---|---|
| 01000 | Ostrzeżenie ogólne | Komunikat informacyjny specyficzny dla sterownika. (Funkcja zwraca SQL_SUCCESS_WITH_INFO). |
| 08S01 | Błąd połączenia komunikacyjnego | Połączenie komunikacyjne między sterownikiem a źródłem danych, z którym sterownik został połączony, nie powiodło się przed zakończeniem przetwarzania funkcji. |
| HY000 | Błąd ogólny | Wystąpił błąd, dla którego nie było określonego stanu SQLSTATE i dla którego nie zdefiniowano parametru SQLSTATE specyficznego dla implementacji. Komunikat o błędzie zwrócony przez element SQLGetDiagRec w buforze *MessageText opisuje błąd i jego przyczynę. |
| HY001 | Błąd alokacji pamięci | Sterownik nie może przydzielić pamięci wymaganej do obsługi wykonywania lub ukończenia funkcji. |
| HY010 | Błąd sekwencji funkcji | (DM) SQLGetFunctions był wywoływany przed SQLConnect, SQLBrowseConnect lub SQLDriverConnect. (DM) SQLBrowseConnect został wywołany dla ConnectionHandle i zwrócił SQL_NEED_DATA. Funkcja ta była wywoływana przed zwróceniem przez SQLBrowseConnect SQL_SUCCESS_WITH_INFO lub SQL_SUCCESS. (DM) SQLExecute, SQLExecDirect lub SQLMoreResults zostały wywołane dla ConnectionHandle i zwracały SQL_PARAM_DATA_AVAILABLE. Ta funkcja została wywołana przed pobraniem danych dla wszystkich parametrów przesyłanych strumieniowo. |
| HY013 | Błąd zarządzania pamięcią | Nie można przetworzyć wywołania funkcji, ponieważ nie można uzyskać dostępu do bazowych obiektów pamięci, prawdopodobnie z powodu niskich warunków pamięci. |
| HY095 | Typ funkcji poza zakresem | (DM) Podano nieprawidłową wartość FunctionId . |
| HY117 | Połączenie jest zawieszone z powodu nieznanego stanu transakcji. Dozwolone są tylko funkcje rozłączania i tylko do odczytu. | (DM) Aby uzyskać więcej informacji na temat stanu wstrzymania, zobacz SQLEndTran, funkcja. |
| HYT01 | Upłynął limit czasu połączenia | Okres przekroczenia limitu czasu połączenia wygasł, zanim źródło danych odpowiedziało na żądanie. Limit czasu połączenia jest ustawiany za pomocą parametru SQLSetConnectAttr, SQL_ATTR_CONNECTION_TIMEOUT. |
Comments
SQLGetFunctions zawsze zwraca informację, że obsługiwane są SQLGetFunctions, SQLDataSources i SQLDrivers . Robi to, ponieważ funkcje te są zaimplementowane w Menedżerze Sterowników. Driver Manager mapuje funkcję ANSI na odpowiadającą mu funkcję Unicode, jeśli taka funkcja istnieje, a także mapuje funkcję Unicode na odpowiadającą mu funkcję ANSI, jeśli funkcja ANSI istnieje. Aby uzyskać informacje o tym, jak aplikacje wykorzystują SQLGetFunctions, zobacz Poziomy zgodności interfejsów.
Poniżej znajduje się lista prawidłowych wartości dla FunctionId dla funkcji spełniających poziom zgodności norm ISO 92:
| Wartość FunctionId | Wartość FunctionId |
|---|---|
| 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 |
Poniżej znajduje się lista poprawnych wartości FunctionId dla funkcji spełniających poziom zgodności ze standardami Open Group:
| Wartość FunctionId | Wartość FunctionId |
|---|---|
| SQL_API_SQLCOLUMNS | SQL_API_SQLSTATISTICS |
| SQL_API_SQLSPECIALCOLUMNS | SQL_API_SQLTABLES |
Poniżej znajduje się lista poprawnych wartości FunctionId dla funkcji zgodnych z poziomem zgodności ze standardami ODBC.
| Wartość FunctionId | Wartość FunctionId |
|---|---|
| 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] Podczas pracy z sterownikiem ODBC 2*.x*, SQLBulkOperations będzie zwracany jako obsługiwany tylko wtedy, gdy oba poniższe elementy są prawdziwe: sterownik ODBC 2*.x* obsługuje SQLSetPos, a typ informacji SQL_POS_OPERATIONS zwraca SQL_POS_ADD bit zgodnie z ustawieniami.
Poniżej znajduje się lista poprawnych wartości dla FunctionId dla funkcji wprowadzonych w ODBC 3.8 lub nowszych:
| Wartość FunctionId |
|---|
| SQL_API_SQLCANCELHANDLE [2] |
[2] SQLCancelHandle zostanie zwrócony jako wspierany tylko wtedy, gdy sterownik obsługuje zarówno SQLCancel, jak i SQLCancelHandle. Jeśli SQLCancel jest obsługiwany, a SQLCancelHandle nie, aplikacja nadal może wywołać SQLCancelHandle na poleceniu instrukcji, ponieważ będzie on przypisany do SQLCancel.
SQL_FUNC_EXISTS Macro
Makro SQL_FUNC_EXISTS(SupportedPtr, FunctionID) służy do określenia wsparcia funkcji ODBC 3*.x* lub wcześniejszych po wywołaniu SQLGetFunctions za pomocą argumentu FunctionId SQL_API_ODBC3_ALL_FUNCTIONS. Wywołania aplikacji SQL_FUNC_EXISTS z argumentem SupportedPtr ustawionym na SupportedPtr przekazanym w SQLGetFunctions oraz z argumentem FunctionID ustawionym na #define dla tej funkcji. SQL_FUNC_EXISTS zwraca SQL_TRUE, jeśli funkcja jest wspierana, a SQL_FALSE w przeciwnym przypadku.
Note
Podczas pracy z sterownikiem ODBC 2*.x*, menedżer sterowników ODBC 3*.x* zwraca SQL_TRUE dla SQLAllocHandle i SQLFreeHandle , ponieważ SQLAllocHandle jest mapowany na SQLAllocEnv, SQLAllocConnect lub SQLAllocStmt, a także dlatego, że SQLFreeHandle jest mapowany na SQLFreeEnv, SQLFreeConnect lub SQLFreeStmt. SQLAllocHandle lub SQLFreeHandle z argumentem HandleType SQL_HANDLE_DESC nie jest obsługiwany, mimo że SQL_TRUE jest zwracany dla funkcji, ponieważ w tym przypadku nie ma funkcji ODBC 2*.x*, do której można by się odwzorować.
Przykład kodu
Poniższe trzy przykłady pokazują, jak aplikacja wykorzystuje SQLGetFunctions do określenia, czy sterownik obsługuje SQLTables, SQLColumns i SQLStatistics. Jeśli sterownik nie obsługuje tych funkcji, aplikacja rozłącza się z sterownikiem. Pierwszy przykład wywołuje SQLGetFunctions raz dla każdej funkcji.
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);
W drugim przykładzie aplikacja ODBC 3.x wywołuje SQLGetFunctions i przekazuje mu tablicę, w której SQLGetFunctions zwraca informacje o wszystkich funkcjach ODBC 3.x i wcześniejszych.
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);
Trzecim przykładem jest aplikacja ODBC 2.x wywołująca SQLGetFunctions i przekazuje jej tablicę 100 elementów, w której SQLGetFunctions zwraca informacje o wszystkich funkcjach ODBC 2.x i wcześniejszych.
#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);
Powiązane funkcje
| Aby uzyskać informacje o | Zobacz |
|---|---|
| Zwracanie ustawienia atrybutu połączenia | SQLGetConnectAttr, funkcja |
| Zwracanie informacji o sterowniku lub źródle danych | Funkcja SQLGetInfo |
| Zwracanie ustawienia atrybutu instrukcji | SQLGetStmtAttr, funkcja |