2011-09-09 216 views
0

我遇到了一些問題。我從我的程序的SQL Server數據庫中獲取一些值,對它們進行一些計算,然後將計算值寫回數據庫。然而,有些值給我"Error Invalid column name 'NaN'."真的沒有什麼獨特的關於造成這個問題的列。它們與完美工作的列是相同的浮點型列。SQL Server錯誤列名無效'NaN'

con.Open(); 

AddPhase1Calc = new SqlCommand("UPDATE Asset SET Make_Up_Depr = " + Make_Up_Depr + " WHERE Asset_ID = " + a, con); 

AddPhase1Calc.ExecuteNonQuery(); 


con.Close(); 

我不確定這是否足夠的代碼,但這是第一列導致我的問題。

+0

警告。你的代碼容易受到SQL注入攻擊。 –

+0

@Daniel:它取決於Make_Up_Depr來自哪裏。如果不是來自用戶輸入,那麼它的可能性就小得多。 – Joe

+0

是真實的,但仍然很難說。 –

回答

0

我打算猜測Make_Up_Depr是一個雙精度值,並且在某些情況下,計算的結果是零值除零。這會導致值爲NaN和SQL正試圖將其評價爲列名/別名(因爲它不是一個雙值...)

+1

我從來沒有見過一種語言,除以零的結果在NaN。 – NullUserException

+0

對不起,ZERO除以零。 http://msdn.microsoft.com/en-us/library/system.double.nan.aspx – Joe

+0

謝謝先生,我修正了被零除的列,它完美的工作! – Aaron

1

你需要把周圍的Make_Up_Depr值單引號:

AddPhase1Calc = new SqlCommand("UPDATE Asset SET Make_Up_Depr = '" + Make_Up_Depr + 
    "' WHERE Asset_ID = " + a, con); 

另外,您不應該以這種方式構建SQL語句。如果變量來自用戶輸入,那麼您會接受SQL注入攻擊。你應該使用參數。

最後,該代碼需要在using塊:

using (SqlConnection con = whatever) 
{ 
    con.Open(); 

    using (AddPhase1Calc = new SqlCommand("UPDATE Asset SET Make_Up_Depr = '" + 
     Make_Up_Depr + "' WHERE Asset_ID = " + a, con)) 
    { 
     AddPhase1Calc.ExecuteNonQuery(); 
    } 
} 
0

一個你的價值觀,無論是Make_Up_Depra正在評估對NaN。由於這是一個字符串,因此SQL Server認爲您正在嘗試通過該名稱引用一列。