2013-08-17 78 views
1

我正在使用odbc在native C++中創建一個應用程序。我正在調用一個有小數參數的sql server存儲過程。我正在向該參數傳遞一個浮點數。到目前爲止的代碼:C++ float到sql server DECIMAL正確轉換

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?

回答

1

reference

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) 
+0

仍然不起作用。我修改了代碼以使用5作爲緩衝區長度。我也嘗試過10,15等,並且它仍然在場中存儲0。 進一步閱讀有關SQLBindParameter的文檔,似乎該參數有時會被忽略(但我不確定是否在這種情況下它被忽略)。我已經閱讀並重新閱讀了文檔,但這並不符合我的想法。 :D –

0

的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))); 
} 
+0

我終於明白了。你的回答足夠接近。它不應該是'SQLDECIMAL * sql_param = new SQLDECIMAL(param);'。它應該是'SQLDECIMAL * sql_param =(SQLDECIMAL *)參數;' –

+0

我是否完全錯誤:您有一個浮點數(SQL_C_FLOAT)作爲參數否SQLDECIMAL –

0

我明白了。它應該不是: SQLDECIMAL *sql_param = new SQLDECIMAL(param); 它應該是: SQLDECIMAL *sql_param = (SQLDECIMAL *) param;