1

我正在使用 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 );
}

参数是一个浮点数。

存储在表中的始终为 0,而不是实际值 1.45。我猜正在发生一些转换,但我无法弄清楚正确的转换。SQL_C_FLOAT -> SQL_DECIMAL?

4

3 回答 3

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为零。看这里,你可以看到不同精度值的小数长度:

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 )
于 2013-08-17T05:14:21.303 回答
1

SQLDECIMAL 是你的问题。根据http://publib.boulder.ibm.com/infocenter/soliddb/v6r3/index.jsp?topic=/com.ibm.swg.im.soliddb.programmer.doc/doc/s0005314.c.data.types .html它是一个无符号字符 [f]。我建议类似:

void bind_float(float* param) {
    SQLBindParameter( statement_handle, 5, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_DECIMAL, 12, 6, param, 0, NULL ) ) );
}
于 2013-08-17T07:24:42.490 回答
0

我知道了。它不应该是: SQLDECIMAL *sql_param = new SQLDECIMAL( param ); 它应该是: SQLDECIMAL *sql_param = (SQLDECIMAL *) param;

于 2013-08-17T14:40:59.780 回答