none
ODBC SQLBindParameter 绑定一个double, 在德文XP下运行出错 RRS feed

  • 问题

  • 在德文的XP下,小数字点是逗号。运行下面的代码。
    就出现:[Microsoft][ODBC SQL Server Driver][SQL Server]There are fewer columns in the INSERT statement than values specified in the VALUES clause. The number of values in the VALUES clause must match the number of columns specified in the INSERT statement.

    retcode = SQLPrepare(hstmt, _T("Insert into Emp(empId, empName, salary) values(?, ?, ?"), SQL_NTS);
    .....
    retcode = SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DOUBLE, 0, 0, &m_dSalary, 0, 0);
    在控制面板中将“Standards and formats"改为English。一切运行正常。
    请问,要怎样解决这个问题。

    2009年10月16日 3:19

答案

  • thanks Ronggan. 原来是我程序中的bug. 我程序中的Insert刚开始使用的是 CString szSQL; szSQL.Format(_T("Insert into Emp(empId, empName, salary) values(%d, '%s', %f)"), nEmpID, szName, dSalary); 出现错误的时候我只是把这段改过来了呢。还有一段并没有改过来。所以就出现了那个错误。 谢谢大家了!!
    • 已标记为答案 dxaw2000 2009年10月20日 5:29
    2009年10月20日 5:29

全部回复



  • set language 命令即可 更多参见

    http://msdn.microsoft.com/zh-cn/library/aa175397(SQL.80).aspx


    family as water
    2009年10月16日 5:42
  • Thanks Stone. 执行了set language,但是insert时错误依然存在。

    2009年10月16日 8:02
  • 请问你的XP客户机上,安装SQL Server client没有?我问这个问题想确认的是你用的MDAC还是SNAC。

    如果用的MDAC(Windows自带的ODBC Driver),那么建议打打补丁试试,例如下面一个问题可能和你这个有点关系。另外,也可以安装SQL Server client再试试。
    http://support.microsoft.com/default.aspx/kb/812554

    另外,能不能提供错误信息的更多信息,例如SQLSTATE的值,等等。

    2009年10月19日 10:12

  • 看不太懂德文,所以我在英文 Windows7 上, 把Standards and Formats 设为German.

    然后运行程序,在我的机器上是没问题的:


    #include "stdafx.h"
    #include <Windows.h>
    #include <sql.h>
    #include <sqlext.h>
    #include <sqltypes.h>
    #include <stdio.h>
    #include <ODBCSS.h>
    #include <iostream>
    #include <odbcinst.h>
    
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        RETCODE rc;
        HENV henv = NULL;
        HDBC hdbc = NULL;
        HSTMT hstmt = NULL;
    
        // allocate environment handle
        rc = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
        if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { return -1; }
    
        // set the environment attribute
        rc = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0);
        if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { return -1; }
    
        // allocate connection handle
        rc = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
        if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { return -1; }
    
    
    	// using SQLDriverConnect to connect to the database
    	rc = SQLDriverConnect(
    		hdbc,
    		NULL,
    		(SQLTCHAR *) TEXT("Driver={SQL Server};Server=myServer;UID=sa;PWD=xxxx"),	
    		SQL_NTS,
    		NULL,
    		0,
    		NULL,
    		SQL_DRIVER_NOPROMPT
    		);
    	if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) 
        { 
            return -1; 
        }
    
        // allocate statement handle
        rc = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
        if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { return -1; }
    
        _TCHAR cmd[1000];
    
        // SQLPrepare
        rc = SQLPrepare(hstmt, (SQLTCHAR *)
            TEXT("INSERT INTO Emp (empID, salary) VALUES (?, ?)"), 
            SQL_NTS);
    
    	int ID = 4;
    	double salary = 4.44;
    	int cbID; 
    
        rc = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0,
             &ID, 0, 0);
        if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { return -1; }    
    
        rc = SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DOUBLE, 0, 0,
             &salary, 0, 0);
    
        if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { return -1; }    
    
        rc = SQLExecute(hstmt);
    
        SQLFreeStmt(hstmt, SQL_CLOSE);
        SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
        SQLDisconnect(hdbc);
        SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
        SQLFreeHandle(SQL_HANDLE_ENV, henv);    
        return 0;
    }
    
    你能不能在你的英语Windows XP上,把Standards and Formats 设为German, 看问题能不能repro?
    2009年10月20日 2:38
  • Thanks Hunter, Ronggan
    上面的代码在德文环境下是可以正常运行的。

    我的代码是将SQL操作放在一个dll中的。
    我将英文XP pro Sp2将Standards and Formats 设为German.
    执行retcode = SQLExecDirect(hstmt, _T("Insert into Emp(empId, empName, salary) values(10, 'Test', 20"), SQL_NTS)
    都会出现:[Microsoft][ODBC SQL Server Driver][SQL Server]There are fewer columns in the INSERT statement than values specified in the VALUES clause. The number of values in the VALUES clause must match the number of columns specified in the INSERT statement.
    将Standards and Formats 改回English 一切正常。而且只要是小数点的格式不是".", 只要是其它格式就会出错。不管在什么版本的OS下。

    2009年10月20日 3:49
  • 你那边能不能给我们一个repro程序? 能够在Windows XP  English上,执行重现的。或者打开ODBC Trace, 把Trace log发给我们。ODBC Trace可能发现不了什么原因,所以最好的办法就是你能写一个在Windows XP English操作系统上的一个repro, 然后我们这里分析调试就很容易了。
    2009年10月20日 4:25
  • thanks Ronggan. 原来是我程序中的bug. 我程序中的Insert刚开始使用的是 CString szSQL; szSQL.Format(_T("Insert into Emp(empId, empName, salary) values(%d, '%s', %f)"), nEmpID, szName, dSalary); 出现错误的时候我只是把这段改过来了呢。还有一段并没有改过来。所以就出现了那个错误。 谢谢大家了!!
    • 已标记为答案 dxaw2000 2009年10月20日 5:29
    2009年10月20日 5:29