调用以下ODBC API时,IBM DB2 ODBC驱动程序返回错误的值:
void Test()
{
// Allocate environment handle.
SQLHENV environmentHandle;
SQLRETURN returnCode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &environmentHandle);
// Set ODBC version to 3.8
returnCode = SQLSetEnvAttr(environmentHandle, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3_80, 0);
// Allocate connection handle.
SQLHDBC connectionHandle;
returnCode = SQLAllocHandle(SQL_HANDLE_DBC, environmentHandle, &connectionHandle);
// Connect to the database.
TCHAR dsn[] = _T("DSN=ODBCDB2"), connStringOut[100] = _T("");
SQLSMALLINT connStringOutSize = 0;
returnCode = SQLDriverConnect(connectionHandle, NULL, (SQLTCHAR *)dsn, _tcslen(dsn), (SQLTCHAR*)connStringOut, sizeof(connStringOut) / sizeof(TCHAR), &connStringOutSize, SQL_DRIVER_NOPROMPT);
// connStringOut = L"DSN=ODBCDB2;UID=<userid>;PWD=<password>;DBALIAS=TESTDB"
// Retrieve the quote character.
TCHAR quoteValue[15] = _T("");
SQLSMALLINT infoValue = 0;
returnCode = SQLGetInfo(connectionHandle, SQL_IDENTIFIER_QUOTE_CHAR, "eValue, sizeof(quoteValue), &infoValue);
// quoteValue = L"03.80"
// infoValue = 10
}
API调用SQLGetInfo()
应返回引号,例如双引号(“),单引号(')等。相反,它返回不正确的03.80
。此值看起来成为ODBC驱动程序版本。
更新:如果将SQL_OV_ODBC3_80
中的参数SQLSetEnvAttr()
更改为SQL_OV_ODBC3
或SQL_OV_ODBC2
,则引号是正确的(“ )。看起来是特定于版本的问题。
环境详细信息:
- IBM DB2 v11.5.0.1077
- IBM DB2 ODBC驱动程序v11.5.0.1077(32位)
- ODBC v3.8
- VC ++(Visual Studio 2017)
- Windows 10 64位
非常感谢您的帮助。 谢谢!
答案 0 :(得分:1)
如果使用该版本进行编译,则Db2 V11.5“ sqlext.h”已经具有SQL_SPEC_MAJOR(3)和SQL_SPEC_MINOR(“ 80”),这意味着不必在代码中明确设置该ODBC版本,因为该版本可能是V11.5的默认版本,尽管文档有建议!
Db2 documentation不够充分,因为它的注释不正确:
“如果将SQL_ATTR_ODBC_VERSION属性设置为SQL_OV_ODBC3_80 (值380),CLI返回“ 03.80””
即使您正在查询SQL_IDENTIFIER_QUOTE_CHAR
,代码也似乎会返回该值。稍作更改即可正确初始化TCHAR数组后,我可以用VS2019和V11.5重现该症状。对我来说,这似乎是不受欢迎的行为,但是只有IBM可以决定它是否有缺陷。
我建议您针对该特定问题打开具有IBM Db2支持的凭单。
如您所见,解决方法是使用V11.5标头/库进行编译/链接,而不用SQL_ATTR_ODBC_VERSION显式设置ODBC版本(即,省略代码行returnCode = SQLSetEnvAttr(environmentHandle, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3_80, 0);
)。在这种情况下,引号字符的SQLGetInfo
返回正确的值。