+ -
当前位置:首页 → 问答吧 → 使用"select ?<=?"语句通过ODBC判断大小结果不正确

使用"select ?<=?"语句通过ODBC判断大小结果不正确

时间:2011-12-11

来源:互联网

蛋疼直接用sql判断大小,更蛋疼的是比较结果是错的,不知道是不是用SQLBindParameter的时候有参数有问题.到底是怎么回事???
测试程序主要部分如下:
SQL code

    HSTMT hstmt;
    SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt);
    hr=SQLPrepare(hstmt,(SQLCHAR *)"select ?<=?",SQL_NTS);
    
    char a[10],b[]="99999.9";
    SQLUINTEGER ok;
    SQLLEN lenbuf1=SQL_NTS,lenbuf2;
    hr=SQLBindParameter(hstmt,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_DECIMAL,8,1,a,sizeof(a)/sizeof(*a),&lenbuf1);
    hr=SQLBindParameter(hstmt,2,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_DECIMAL,8,1,b,sizeof(b)/sizeof(*b),&lenbuf1);
    hr=SQLBindCol(hstmt,1,SQL_C_ULONG,&ok,0,&lenbuf2);
    while(cin>>a)
    {
        if(SQL_SUCCEEDED(SQLExecute(hstmt)))
            if(SQL_SUCCEEDED(SQLFetch(hstmt)))
            {
                cout<<"result is "<<ok<<endl;
                SQLCloseCursor(hstmt);
                continue;
            }
        cout<<"something wrong"<<endl;
    }




测试结果如下:
1234
result is 1
99999.9
result is 1
100000
result is 1
1000000
result is 1
100000.1
result is 1
9999999
result is 0
9999991
result is 0
1111111
result is 1

作者: supersuperhunter   发布时间: 2011-12-11

先不考虑你的程序,直接在MYSQL工具中试一下你的SQL语句结果。

作者: ACMAIN_CHM   发布时间: 2011-12-11

引用 1 楼 acmain_chm 的回复:

先不考虑你的程序,直接在MYSQL工具中试一下你的SQL语句结果。


如果把?替换成相应的数字的话在命令行里是没问题的,忘了说了一点,用printf硬编码sql语句的话就不会出问题
mysql> select 100000<=99999.9;
+-----------------+
| 100000<=99999.9 |
+-----------------+
| 0 |
+-----------------+
这个测试用程序测却不对

作者: supersuperhunter   发布时间: 2011-12-11

你是不是用的字符类型?

'100000'<='99999.9'

作者: ACMAIN_CHM   发布时间: 2011-12-11

引用 3 楼 acmain_chm 的回复:

你是不是用的字符类型?

'100000'<='99999.9'

SQLBindParameter的第4个参数是c type,制定为SQL_C_CHAR,第5个参数为sql type,已经是指定为SQL_DECIMAL,这样mysql应该就是把传进来的参数由字符串转换成decimal类型再比较,我的用法应该没错吧

作者: supersuperhunter   发布时间: 2011-12-11