IBM DB2 ODBC驱动程序为ODBC API SQLGetInfo()返回错误的值

时间:2019-11-22 16:05:38

标签: db2 odbc

调用以下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, &quoteValue, sizeof(quoteValue), &infoValue);
   // quoteValue = L"03.80"
   // infoValue = 10
}

API调用SQLGetInfo()应返回引号,例如双引号(“),单引号(')等。相反,它返回不正确的03.80。此值看起来成为ODBC驱动程序版本。

更新:如果将SQL_OV_ODBC3_80中的参数SQLSetEnvAttr()更改为SQL_OV_ODBC3SQL_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位
  •   

非常感谢您的帮助。 谢谢!

1 个答案:

答案 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返回正确的值。