我绑定了以下参数来调用SQL过程:
TCHAR str[41];
SQLINTEGER cb;
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT_OUTPUT, SQL_C_TCHAR, SQL_C_TCHAR, 40, 0, str, 0, &cb);
当我在调用查询后循环遍历str时,我可以看到结果存在,但它不太正确:
std::stringstream ss;
ss<<"{";
for(int i=0;i<41;++i)
{
ss<<(int)str[i];
if(i<40)ss<<',';
}
ss<<"}"<<endl<<"{";
for(int i=0;i<41;++i)
{
if(str[i])
ss<<"'"<<str[i]<<"'";
else
ss<<"null";
if(i<40)ss<<',';
}
ss<<"}"<<endl;
cout<<ss.str();
{53,55,56,49,53,的 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 ,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 下,0} {'5','7','8','1','5','','','','','','','','',''' ,'','','','','','','','','','','','','','','','','',' ','','','','','','','','','',null}
无论出于何种原因,str都用空格填充。我知道SQL过程实际上是通过单独测试来返回“57815”。有什么想法正在发生什么以及如何解决它? 执行SQL调用后,cb值设置为40。
答案 0 :(得分:1)
如果SQL数据库字段的类型为CHAR,则它将填充空格(如果它不是CHAR,它是什么类型的?)。这是预期的行为。如果不是,您确定SQL_C_TCHAR是您真正想要的类型 - 它不会列在this MSDN page上。
答案 1 :(得分:0)
您应该使用VARCHAR而不是CHAR,使用SQL_VARCHAR作为参数的SQL类型