Node.js 节点odbc导致错误“;CLI0002W数据截断“;

Node.js 节点odbc导致错误“;CLI0002W数据截断“;,node.js,db2,node-odbc,Node.js,Db2,Node Odbc,我使用Node.js将基于Node.js的应用程序连接到遗留的IBM DB2数据库 在Windows7上 DB2 ODBC驱动程序是32位的,因此节点ODBC二进制文件是使用node gyp clean configure build--arch=ia32--msvs\u version=2015创建的 32位Node.js 4.4.5 这基本上很好用。但是,由于以下问题,我目前在节点odbc二进制文件中禁用了Unicode(在中标记Unicode): 如果我启用UNICODE,我可以 使用

我使用Node.js将基于Node.js的应用程序连接到遗留的IBM DB2数据库

  • 在Windows7上
  • DB2 ODBC驱动程序是32位的,因此节点ODBC二进制文件是使用
    node gyp clean configure build--arch=ia32--msvs\u version=2015创建的
  • 32位Node.js 4.4.5
这基本上很好用。但是,由于以下问题,我目前在节点odbc二进制文件中禁用了Unicode(在中标记Unicode):

如果我启用UNICODE,我可以

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

    {[错误:[IBM][CLI驱动程序]CLI0002W数据被截断。SQLSTATE=01004] 错误:[{消息:'[IBM][CLI驱动程序]CLI0002W数据被截断。SQLSTATE=01004',状态:'01004'}],错误:'[node odbc]SQL_错误',消息:'[IBM][CLI驱动程序]CLI0002W数据被截断。SQLSTATE=01004', 状态:'01004'}

    这对我没有帮助

    我查看了中启用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
    
    显然,会将带有null结尾的字符串写入缓冲区参数ValuePtr。SQL表示以null结尾的字符串(请参阅中的StrLen或IndPtr说明)

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

  • 或者它太小,因此ODBC驱动程序找不到终止字符串的空字符
  • 或者太大,所以可能驱动程序会抱怨空字符出现在缓冲区结尾之前。这确实是一个假设

  • 因此:我想知道应该如何更正代码,以便将类似字符串的参数传递给ODBC驱动程序。有什么想法吗?

    既然这是一个警告,您是否尝试忽略它以查看语句是否实际按预期执行?另请参阅:“如果ParameterType表示图形数据类型,ValueType为SQL_C_CHAR,则指向StrLen_或_IndPtr的指针永远不能为空,StrLen_或_IndPtr的内容永远不能包含SQL_NTS”(“图形数据类型”特别指双字节字符串)。由于这是一个警告,您是否尝试忽略它以查看语句是否实际按预期执行?另请参见中的注释:“如果ParameterType表示图形数据类型,ValueType为SQL_C_CHAR,则指向StrLen_或_IndPtr的指针永远不能为空,StrLen_或_IndPtr的内容永远不能包含SQL_NTS”(“图形数据类型”)“特别是指双字节字符串)。