SQLGetFunctions 函数

一致性
引入的版本:ODBC 1.0 标准符合性:ISO 92

总结
SQLGetFunctions 返回驱动程序是否支持特定 ODBC 函数的信息。 该功能在驱动程序管理器中实现;它也可以在驱动程序中实现。 如果驱动程序实现 了 SQLGetFunctions,驱动管理器会调用驱动中的该函数。 否则,它会执行该函数本身。

Syntax

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

Arguments

ConnectionHandle
[输入] 连接句柄。

FunctionId
[输入]一个 #define 值,用于识别感兴趣的ODBC函数; SQL_API_ODBC3_ALL_FUNCTIONS orSQL_API_ALL_FUNCTIONSSQL_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。

如果 FunctionIdSQL_API_ODBC3_ALL_FUNCTIONS,SupportedPtr 指向一个元素数为 SQL_API_ODBC3_ALL_FUNCTIONS_SIZE 的 SQLSMALLINT 数组。 该数组被驱动管理器视为4000位位图,可用于判断是否支持ODBC 3*.x*或更早函数。 调用SQL_FUNC_EXISTS宏来确定函数支持。 (参见“评论”。)ODBC 3*.x* 应用程序可以调用带有 SQL_API_ODBC3_ALL_FUNCTIONS的 SQLGetFunctions ,针对 ODBC 3*.x* 或 ODBC 2*.x* 驱动。

如果 FunctionIdSQL_API_ALL_FUNCTIONS,SupportedPtr 指向一个包含 100 个元素的 SQLUSMALLINT 数组。 该数组由 FunctionID 用于识别每个 ODBC 函数的 #define 值进行索引;数组中有些元素未被使用,保留以备将来使用。 如果该元素标识驱动程序支持的ODBC 2*.x*或更早函数,则该元素被SQL_TRUE。 如果识别出驱动程序不支持的ODBC函数或未识别ODBC函数,则SQL_FALSE。

*SupportedPtr 中返回的数组采用基于零的索引。

Returns

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_ERROR 或SQL_INVALID_HANDLE。

诊断

SQLGetFunctions 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可以通过调用 SQLGetDiagRecHandleType 为 SQL_HANDLE_DBC 和 ConnectionHandle 的 Handle 来获得关联的 SQLSTATE 值。 下表列出 了 SQLGetFunctions 通常返回的 SQLSTATE 值,并在此函数的上下文中对每个值进行了解释;“(DM)” 符号位于驱动程序管理器返回的 SQLSTATE 描述之前。 除非另有说明,否则与每个 SQLSTATE 值关联的返回代码SQL_ERROR。

SQLSTATE Error Description
01000 常规警告 特定于驱动程序的信息性消息。 (函数返回SQL_SUCCESS_WITH_INFO。)
08S01 通信链接失败 驱动程序与驱动程序连接到的数据源之间的通信链接在函数完成处理之前失败。
HY000 常规错误 发生错误:没有特定的 SQLSTATE,也没有定义特定于实现的 SQLSTATE。 *MessageText 缓冲区中 SQLGetDiagRec 返回的错误消息描述错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成函数所需的内存。
HY010 函数序列错误 (DM) SQLGetFunctions 是在 SQLConnectSQLBrowseConnectSQLDriverConnect 之前被调用的。

(DM) SQLBrowseConnect 被调用以获取 ConnectionHandle 并返回SQL_NEED_DATA。 该函数在 SQLBrowseConnect 返回 SQL_SUCCESS_WITH_INFO 或 SQL_SUCCESS 之前被调用。

(DM) SQLExecuteSQLExecDirectSQLMoreResults 被调用 ConnectionHandle 并返回SQL_PARAM_DATA_AVAILABLE。 在检索所有流式处理参数的数据之前调用此函数。
HY013 内存管理错误 无法处理函数调用,因为基础内存对象无法访问,可能是因为内存条件低。
HY095 功能类型超出范围 (DM) 指定了一个无效 的 FunctionId
HY117 连接因未知事务状态而挂起。 仅允许断开连接和只读函数。 (DM) 有关挂起状态的详细信息,请参阅 SQLEndTran 函数
HYT01 超过连接超时时间 在数据源响应请求之前,连接超时期限已过期。 连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT。

Comments

SQLGetFunctions 总是返回支持 SQLGetFunctionsSQLDataSourcesSQLDrivers 的信息。 这是因为这些功能是在驱动程序管理器中实现的。 驱动程序管理器会将 ANSI 函数映射到对应的 Unicode 函数(如果存在 Unicode 函数),如果存在 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

以下是符合开放组标准合规级别的函数 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] 只有当驱动程序同时支持 SQLCancelSQLCancelHandle 时,SQLCancelHandle 才会返回为支持。 如果支持 SQLCancel 但不支持 SQLCancelHandle ,应用程序仍然可以在语句句柄上调用 SQLCancelHandle ,因为它会映射到 SQLCancel

SQL_FUNC_EXISTS 宏观

SQL_FUNC_EXISTS(SupportedPtrFunctionID)宏用于确定在调用 SQLGetFunctions 并以 FunctionID 参数为 SQL_API_ODBC3_ALL_FUNCTIONS 后,支持 ODBC 3*.x* 或更早的函数。 应用程序调用SQL_FUNC_EXISTS时,SupportedPtr参数设置为SQLGetFunctions传递的SupportedPtr 参数,FunctionID参数设置为该函数的 #define。 SQL_FUNC_EXISTS 如果支持该函数,返回SQL_TRUE,否则SQL_FALSE。

注释

在使用 ODBC 2*.x* 驱动时,ODBC 3*.x* 驱动管理器会返回 SQLAllocHandleSQLFreeHandle 的 SQL_TRUE,因为 SQLAllocHandle 映射为 SQLAllocEnvSQLAllocConnectSQLAllocStmt,且 SQLFreeHandle 映射为 SQLFreeEnvSQLFreeConnectSQLFreeStmt。 然而,SQLAllocHandleSQLFreeHandleHandleHandle(HandleType)参数为 SQL_HANDLE_DESC 不被支持,尽管这些函数返回了 SQL_TRUE,因为此时没有 ODBC 2*.x* 函数可供映射。

代码示例

以下三个示例展示了应用程序如何使用 SQLGetFunctions 来判断驱动程序是否支持 SQLTablesSQLColumnsSQLStatistics。 如果驱动程序不支持这些功能,应用程序将与驱动程序断开连接。 第一个示例为每个函数调用 一次 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);  

在第二个例子中,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);  

第三个例子是 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 函数