node-odbc导致错误“CLI0002W数据被截断”

时间:2016-11-10 17:01:24

标签: node.js db2 node-odbc

我正在使用node-odbc将基于Node.js的应用程序连接到旧的IBM DB2数据库。

  • 在Windows 7上
  • DB2 ODBC驱动程序是32位,因此使用node-gyp clean configure build --arch=ia32 --msvs_version=2015
  • 创建了node-odbc二进制文件
  • 32位
  • 中的Node.js 4.4.5

这大部分工作正常。但是,由于以下问题,我目前在node-odbc二进制文件中禁用了Unicode(在binding.gyp中标记为UNICODE):

如果我启用UNICODE,我可以

  1. 使用简单的SQL语句(如query = select * from sysibm.sysdummy1
  2. 正确检索数据
  3. 使用非字符串参数绑定运行查询(例如query = select * from syscat.tables where tableid = ?,bindings = [0];
  4. 但是,如果我使用字符串参数(例如query = select * from syscat.tables where tabname = ?,bindings = ['SYSDUMMY1'])运行查询,则ODBC驱动程序会抛出错误消息

      

    {[错误:[IBM] [CLI驱动程序] CLI0002W数据被截断。 SQLSTATE = 01004]   错误:[{message:'[IBM] [CLI驱动程序] CLI0002W数据被截断。 SQLSTATE = 01004',state:'01004'}],错误:'[node-odbc] SQL_ERROR',消息:'[IBM] [CLI驱动程序] CLI0002W数据被截断。 SQLSTATE = 01004' ,   州:'01004'}

    它的explanation at IBM documentation对我没有帮助。

    我查看了relevant node-odbc code中启用了UNICODE的片段,该片段将字符串写入缓冲区,该缓冲区将传递给ODBC驱动程序:

    #ifdef UNICODE
          params[i].ParameterType     = SQL_WVARCHAR;
          params[i].BufferLength      = (length * sizeof(uint16_t)) + sizeof(uint16_t);
    #else
          params[i].ParameterType     = SQL_VARCHAR;
          params[i].BufferLength      = string->Utf8Length() + 1;
    #endif
          params[i].ParameterValuePtr = malloc(params[i].BufferLength);
          params[i].StrLen_or_IndPtr  = SQL_NTS;//params[i].BufferLength;
    
    #ifdef UNICODE
          string->Write((uint16_t *) params[i].ParameterValuePtr);
    #else
          string->WriteUtf8((char *) params[i].ParameterValuePtr);
    #endif
    

    显然,string->Write将带有null-terminal的字符串写入缓冲区 ParameterValuePtr SQL_NTS 表示以空字符结尾的字符串(请参阅IBM documentation StrLen_or_IndPtr 的说明。)

    从错误消息判断,我假设缓冲区没有正确的大小,计算为(length * sizeof(uint16_t)) + sizeof(uint16_t)(字符串的长度,以字节为单位,对于unicode字符+ 1个附加字符,空终止符):

    1. 要么太小,所以ODBC驱动程序找不到终止字符串的空字符
    2. 或者太大了,也许驱动程序抱怨空字符在缓冲区结束之前出现。这真的是一个假设!
    3. 所以:我想知道如何更正代码,以便可以将类似字符串的参数传递给ODBC驱动程序。有什么想法吗?

0 个答案:

没有答案