我正在使用node-odbc将基于Node.js的应用程序连接到旧的IBM DB2数据库。
node-gyp clean configure build --arch=ia32 --msvs_version=2015
这大部分工作正常。但是,由于以下问题,我目前在node-odbc二进制文件中禁用了Unicode(在binding.gyp中标记为UNICODE):
如果我启用UNICODE,我可以
select * from sysibm.sysdummy1
)select * from syscat.tables where tableid = ?
,bindings = [0]
; 但是,如果我使用字符串参数(例如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个附加字符,空终止符):
所以:我想知道如何更正代码,以便可以将类似字符串的参数传递给ODBC驱动程序。有什么想法吗?