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 ); }
param是一个float 表中存储的总是0,而不是实际值1.45。我猜有一些转换正在进行,但我想不出正确的转换。SQL\u C\u浮点->SQL\u十进制?中的: 您已将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
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 ) ) );
}