IN / OUT参数上的SQLBindParameter问题

时间:2010-02-09 10:10:10

标签: c++ odbc

我绑定了以下参数来调用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。

2 个答案:

答案 0 :(得分:1)

如果SQL数据库字段的类型为CHAR,则它将填充空格(如果它不是CHAR,它是什么类型的?)。这是预期的行为。如果不是,您确定SQL_C_TCHAR是您真正想要的类型 - 它不会列在this MSDN page上。

答案 1 :(得分:0)

您应该使用VARCHAR而不是CHAR,使用SQL_VARCHAR作为参数的SQL类型