c++;浮点到sql server十进制的正确转换 我使用ODBC在本地C++中创建应用程序。我正在调用一个具有十进制参数的sql server存储过程。我正在向该参数传递一个浮点。迄今为止的守则: SQLDECIMAL *sql_param = new SQLDECIMAL( param); if( SQL_ERROR == ( result = SQLBindParameter( statement_handle, 5, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_DECIMAL, 12, 6, sql_param, 0, NULL ) ) ){ std::wstring error = get_error_message( SQL_HANDLE_STMT, statement_handle ); throw GenericException( error ); }

c++;浮点到sql server十进制的正确转换 我使用ODBC在本地C++中创建应用程序。我正在调用一个具有十进制参数的sql server存储过程。我正在向该参数传递一个浮点。迄今为止的守则: SQLDECIMAL *sql_param = new SQLDECIMAL( param); if( SQL_ERROR == ( result = SQLBindParameter( statement_handle, 5, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_DECIMAL, 12, 6, sql_param, 0, NULL ) ) ){ std::wstring error = get_error_message( SQL_HANDLE_STMT, statement_handle ); throw GenericException( error ); },c++,sql,odbc,C++,Sql,Odbc,param是一个float 表中存储的总是0,而不是实际值1.45。我猜有一些转换正在进行,但我想不出正确的转换。SQL\u C\u浮点->SQL\u十进制?中的: 您已将BufferLength指定为零。查看,您可以看到不同精度值的小数长度: Precision StorageBytes 1-9 5 10-19 9 20-28 13 29-38 17 因此,您需要调用方法sqlbindparmete

param是一个float

表中存储的总是0,而不是实际值1.45。我猜有一些转换正在进行,但我想不出正确的转换。SQL\u C\u浮点->SQL\u十进制?

中的:

您已将
BufferLength
指定为零。查看,您可以看到不同精度值的小数长度:

Precision      StorageBytes
1-9             5
10-19           9
20-28           13
29-38           17
因此,您需要调用方法
sqlbindparmeter
,如下所示:

SQLBindParameter( statement_handle, 1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_DECIMAL, 12, 6, sql_param, 5, NULL )

SQLDECIMAL是您的问题。根据它是一个无符号字符[f]。 我建议如下:

void bind_float(float* param) {
    SQLBindParameter( statement_handle, 5, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_DECIMAL, 12, 6, param, 0, NULL ) ) );
}

我明白了。不应该是:

SQLDECIMAL*sql_param=新的SQLDECIMAL(param);
应该是:

SQLDECIMAL*sql_param=(SQLDECIMAL*)param;

仍然不起作用。我修改了代码,使用5作为缓冲区长度。我也试过10,15等等。。。它仍然在字段中存储0。进一步阅读SQLBindParameter的文档,似乎该参数有时会被忽略(但我不确定在本例中是否会被忽略)。我已经读了一遍又一遍的文档,只是脑子里想不起来我终于明白了。你的回答很接近。它不应该是
SQLDECIMAL*sql_param=newsqldecimal(param)。它应该是
SQLDECIMAL*sql_param=(SQLDECIMAL*)param我完全弄错了吗:您有一个float(SQL\u C\u float)作为参数no SQLDECIMAL
void bind_float(float* param) {
    SQLBindParameter( statement_handle, 5, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_DECIMAL, 12, 6, param, 0, NULL ) ) );
}