適合 性
導入されたバージョン: ODBC 1.0 標準コンプライアンス: ISO 92
Summary
SQLGetFunctions は、ドライバが特定のODBC関数をサポートしているかどうかの情報を返します。 この機能はドライバーマネージャーで実装されています。また、ドライバーにも実装可能です。 もしドライバが SQLGetFunctionsを実装している場合、ドライバマネージャーはそのドライバ内の関数を呼び出します。 そうでなければ、その関数自体を実行します。
構文
SQLRETURN SQLGetFunctions(
SQLHDBC ConnectionHandle,
SQLUSMALLINT FunctionId,
SQLUSMALLINT * SupportedPtr);
引数
ConnectionHandle
[入力] 接続ハンドル。
FunctionID
[入力]関心のあるODBC関数を識別する #define の値; SQL_API_ODBC3_ALL_FUNCTIONS orSQL_API_ALL_FUNCTIONS。
SQL_API_ODBC3_ALL_FUNCTIONS はODBC 3*.x*アプリケーションでODBC 3*.x*およびそれ以前の機能のサポートを判断するために使われます。
SQL_API_ALL_FUNCTIONS はODBC 2*.x*アプリケーションでODBC 2*.x*およびそれ以前の機能のサポートを判断するために使われます。
ODBC関数を識別する #define 値の一覧については、「コメント」の表を参照してください。
サポートされたPtr
[出力] FunctionId が単一のODBC関数を識別した場合、 SupportedPtr は単一のSQLUSMALLINT値を指し示し、指定された関数がドライバーでサポートされている場合はSQL_TRUE、サポートされていない場合はSQL_FALSEを示します。
FunctionIdがSQL_API_ODBC3_ALL_FUNCTIONSの場合、SupportedPtr はSQL_API_ODBC3_ALL_FUNCTIONS_SIZEの要素数を持つSQLSMALLINT配列を示します。 この配列はドライバーマネージャーによって4,000ビットのビットマップとして扱われ、ODBC 3*.x*以前の機能がサポートされているかどうかを判断するために使われます。 関数サポートを決定するためにSQL_FUNC_EXISTSマクロが呼び出されます。 (「コメント」参照)ODBC 3*.x*アプリケーションは、ODBC 3*.x*またはODBC 2*.x*ドライバに対してSQL_API_ODBC3_ALL_FUNCTIONS付きの SQLGetFunctions を呼び出すことができます。
FunctionIdがSQL_API_ALL_FUNCTIONSの場合、SupportedPtr は100要素のSQLUSMALLINT配列を指し示します。 配列はFunctionIdが各ODBC関数を識別するために使用する #define 値でインデックス付けされます。配列の一部要素は未使用で将来の使用のために予約されています。 要素がドライバでサポートされているODBC 2*.x*以前の関数を識別する場合、その要素がSQL_TRUEされます。 ドライバーがサポートしていないODBC関数を識別する場合や、ODBC関数を識別できない場合はSQL_FALSEされます。
*SupportedPtr で返される配列はゼロベースのインデックスを使用しています。
返品
SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_ERROR、またはSQL_INVALID_HANDLE。
Diagnostics
SQLGetFunctionsがSQL_ERRORまたはSQL_SUCCESS_WITH_INFOを返す場合、SQLGetDiagRecを呼び出し、HandleTypeをSQL_HANDLE_DBC、HandleをConnectionHandleとして呼び出すことで、関連するSQLSTATE値を取得できます。 以下の表は 、SQLGetFunctions が一般的に返すSQLSTATE値と、それぞれをこの関数の文脈で説明しています。「(DM)」という表記は、ドライバーマネージャーが返すSQLstateの記述の前に記載されます。 特に明記されていない限り、各 SQLSTATE 値に関連付けられている戻りコードはSQL_ERROR。
| SQLSTATE | エラー | Description |
|---|---|---|
| 01000 | 一般的な警告 | ドライバー固有の情報メッセージ。 (関数はSQL_SUCCESS_WITH_INFOを返します。 |
| 08S01 | 通信リンクエラー | ドライバーとドライバーが接続されたデータ ソース間の通信リンクは、関数の処理が完了する前に失敗しました。 |
| HY000 | 一般的なエラー | 特定の SQLSTATE がなく、実装固有の SQLSTATE が定義されていないエラーが発生しました。 *MessageText バッファー内の SQLGetDiagRec によって返されるエラー メッセージには、エラーとその原因が記述されています。 |
| HY001 | メモリ割り当てエラー | ドライバーは、関数の実行または完了をサポートするために必要なメモリを割り当てませんでした。 |
| HY010 | 関数シーケンス エラー | (DM) SQLGetFunctions は SQLConnect、 SQLBrowseConnect、 またはSQLDriverConnectよりも先に呼ばれていました。 (DM) SQLBrowseConnect が ConnectionHandle を呼び出し、返SQL_NEED_DATA。 この関数は SQLBrowseConnect がSQL_SUCCESS_WITH_INFOまたはSQL_SUCCESSを返す前に呼び出されました。 (DM) SQLExecute、 SQLExecDirect、または SQLMoreResults が ConnectionHandle に対して呼び出され、返SQL_PARAM_DATA_AVAILABLE。 この関数は、すべてのストリーミング パラメーターのデータが取得される前に呼び出されました。 |
| HY013 | メモリ管理エラー | メモリが不足している可能性があるため、基になるメモリ オブジェクトにアクセスできなかったため、関数呼び出しを処理できませんでした。 |
| HY095 | 関数型が範囲外 | (DM) 無効な FunctionId 値が指定されました。 |
| HY117 | 不明なトランザクション状態のため、接続が中断されます。 切断関数と読み取り専用関数のみが許可されます。 | (DM) 中断状態の詳細については、「 SQLEndTran 関数を参照してください。 |
| HYT01 | 接続がタイムアウトしました | データ ソースが要求に応答する前に、接続タイムアウト期間の有効期限が切れています。 接続タイムアウト期間は、SQL_ATTR_CONNECTION_TIMEOUT SQLSetConnectAttr によって設定されます。 |
Comments
SQLGetFunctions は常に SQLGetFunctions、 SQLDataSources、 SQLDrivers がサポートされていることを返します。 これは、これらの機能がドライバーマネージャーで実装されているためです。 ドライバーマネージャーは、UNICODE関数が存在する場合に対応するUnicode関数にANSI関数をマッピングし、ANSI関数が存在する場合はUnicode関数を対応するANSI関数にマッピングします。 アプリケーションがどのように SQLGetFunctionsを使用するかについては、 インターフェース適合レベルをご覧ください。
以下は、ISO 92標準準拠レベルに準拠した関数の有効な FunctionId 値の一覧です。
| FunctionId値 | 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 |
以下は、Open Group標準準拠レベルに準拠した関数の有効な FunctionID 値の一覧です。
| FunctionId値 | FunctionId値 |
|---|---|
| SQL_API_SQLCOLUMNS | SQL_API_SQLSTATISTICS |
| SQL_API_SQLSPECIALCOLUMNS | SQL_API_SQLTABLES |
以下は、ODBC標準準拠レベルに準拠した関数の FunctionId の有効な値の一覧です。
| FunctionId値 | 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] ODBC 2*.x*ドライバを扱う場合、 SQLBulkOperations は以下の両方が正しい場合にのみサポート済みとして返されます:ODBC 2*.x*ドライバが SQLSetPosをサポートし、情報タイプSQL_POS_OPERATIONSが設定したSQL_POS_ADDビットを返します。
以下は、ODBC 3.8以降で導入された関数に対する FunctionId の有効な値の一覧です。
| FunctionId値 |
|---|
| SQL_API_SQLCANCELHANDLE [2] |
[2] SQLCancelHandle は、ドライバーが SQLCancel と SQLCancelHandleの両方をサポートしている場合のみサポートとして返されます。 SQLCancelがサポートされていてSQLCancelHandleがサポートされていない場合でも、アプリケーションは文ハンドルに対してSQLCancelHandleを呼び出すことができます。なぜなら、その文はSQLCancelにマッピングされるためです。
SQL_FUNC_EXISTSマクロ
SQL_FUNC_EXISTS(SupportedPtr, FunctionID)マクロは、 SQLGetFunctions が FunctionId 引数SQL_API_ODBC3_ALL_FUNCTIONSで呼び出された後、ODBC 3*.x*以前の関数のサポートを決定するために使用されます。 アプリケーションはSupportedPtr引数をSQLGetFunctionsで渡したSupportedPtr に設定し、FunctionID引数を関数の #define に設定してSQL_FUNC_EXISTS呼び出しします。 SQL_FUNC_EXISTSは、その関数がサポートされている場合はSQL_TRUE返し、そうでなければSQL_FALSE返します。
Note
ODBC 2*.x*ドライバを扱う場合、ODBC 3*.x*ドライバーマネージャーはSQLAllocHandleとSQLFreeHandleのSQL_TRUEを返します。これはSQLAllocEnv、SQLAllocConnect、またはSQLAllocStmtにマッピングされており、SQLFreeHandleがSQLFreeEnv、SQLFreeConnect、またはSQLFreeStmtにマッピングされているためです。 ただし、HandleType引数がSQL_HANDLE_DESCのSQLAllocHandleやSQLFreeHandleはサポートされていません。関数に対してSQL_TRUEが返されても、この場合にマッピングできるODBC 2*.x*関数がないためです。
コード例
以下の3つの例は、アプリケーションが SQLGetFunctions を使ってドライバが SQLTables、 SQLColumns、 SQLStatisticsをサポートしているかどうかを判定する方法を示しています。 もしドライバーがこれらの機能をサポートしていない場合、アプリケーションはドライバーから切断されます。 最初の例では、各関数に対して SQLGetFunctions を一度呼び出します。
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);
2つ目の例では、ODBC 3.xアプリケーションが SQLGetFunctions を呼び出し、 SQLGetFunctions がODBC 3.xおよびそれ以前のすべての関数に関する情報を返す配列を渡します。
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);
3つ目の例は、ODBC 2.xアプリケーションが SQLGetFunctions を呼び出し、100要素からなる配列を渡し、 SQLGetFunctions がODBC 2.x以前のすべての関数に関する情報を返すものです。
#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);
関連関数
| ~についての情報 | 参照先 |
|---|---|
| 接続属性の設定を返す | SQLGetConnectAttr 関数 |
| ドライバーやデータソースに関する情報を返す | SQLGetInfo 関数 |
| ステートメント属性の設定を返す | SQLGetStmtAttr 関数 |