2011-09-09 274 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认为您正在尝试通过该名称引用一列。