Node.js 节点odbc导致错误“;CLI0002W数据截断“;
我使用Node.js将基于Node.js的应用程序连接到遗留的IBM DB2数据库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,我可以 使用
- 在Windows7上
- DB2 ODBC驱动程序是32位的,因此节点ODBC二进制文件是使用
node gyp clean configure build--arch=ia32--msvs\u version=2015创建的
- 32位Node.js 4.4.5
select*from sysibm.sysdummy1
)select*from syscat.tables,其中tableid=?
,bindings=[0]
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驱动程序。有什么想法吗?既然这是一个警告,您是否尝试忽略它以查看语句是否实际按预期执行?另请参阅:“如果ParameterType表示图形数据类型,ValueType为SQL_C_CHAR,则指向StrLen_或_IndPtr的指针永远不能为空,StrLen_或_IndPtr的内容永远不能包含SQL_NTS”(“图形数据类型”特别指双字节字符串)。由于这是一个警告,您是否尝试忽略它以查看语句是否实际按预期执行?另请参见中的注释:“如果ParameterType表示图形数据类型,ValueType为SQL_C_CHAR,则指向StrLen_或_IndPtr的指针永远不能为空,StrLen_或_IndPtr的内容永远不能包含SQL_NTS”(“图形数据类型”)“特别是指双字节字符串)。