我正在使用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是一个浮动。
存储在表中的内容始终为0而不是实际值1.45。我猜测正在进行一些转换,但我无法弄清楚正确的转换。 SQL_C_FLOAT - > SQL_DECIMAL?
答案 0 :(得分:1)
SQLRETURN SQLBindParameter(
SQLHSTMT StatementHandle,
SQLUSMALLINT ParameterNumber,
SQLSMALLINT InputOutputType,
SQLSMALLINT ValueType,
SQLSMALLINT ParameterType,
SQLULEN ColumnSize,
SQLSMALLINT DecimalDigits,
SQLPOINTER ParameterValuePtr,
SQLLEN BufferLength,
SQLLEN * StrLen_or_IndPtr);
...
BufferLength
[Input/Output] Length of the ParameterValuePtr buffer in bytes.
您已将BufferLength
指定为零。查看here,您可以看到不同精度值的小数位数:
Precision StorageBytes
1-9 5
10-19 9
20-28 13
29-38 17
因此,您需要将方法SQLBindParameter
称为:
SQLBindParameter( statement_handle, 1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_DECIMAL, 12, 6, sql_param, 5, NULL )
答案 1 :(得分:1)
SQLDECIMAL是你的问题。根据{{3}},它是一个无符号字符[f]。 我建议像:
void bind_float(float* param) {
SQLBindParameter( statement_handle, 5, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_DECIMAL, 12, 6, param, 0, NULL ) ) );
}
答案 2 :(得分:0)
我明白了。它不应该是:
SQLDECIMAL *sql_param = new SQLDECIMAL( param );
应该是:
SQLDECIMAL *sql_param = (SQLDECIMAL *) param;