SQL Server 错误无效的列名“NaN”
Posted
技术标签:
【中文标题】SQL Server 错误无效的列名“NaN”【英文标题】:SQL Server Error Invalid column name 'NaN' 【发布时间】:2011-11-13 10:48:13 【问题描述】:我有点问题。我从我的程序的 SQL Server 数据库中获取一些值,对它们进行一些计算,然后将计算的值写回数据库。但是,一些值给了我"Error Invalid column name 'NaN'."
导致此问题的列确实没有任何独特之处。它们是与正常工作的列相同的浮点型列。
con.Open();
AddPhase1Calc = new SqlCommand("UPDATE Asset SET Make_Up_Depr = " + Make_Up_Depr + " WHERE Asset_ID = " + a, con);
AddPhase1Calc.ExecuteNonQuery();
con.Close();
我不确定这是否足够的代码,但这是导致我出现问题的第一列。
【问题讨论】:
警告。您的代码容易受到 SQL 注入攻击。 @Daniel:这取决于 Make_Up_Depr 的来源。如果不是来自用户输入,那么可能性就小得多。 是的,但仍然很难说。 Make_Up_Depr 是等式的结果。 【参考方案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();
【讨论】:
【参考方案2】:我猜 Make_Up_Depr 是一个双精度数,并且在某些情况下计算是评估零除以零。这导致值为 NaN,并且 SQL 正在尝试将其评估为列名/别名(因为它不是双精度值......)
【讨论】:
我从未见过一种语言除以零会导致 NaN。 对不起,零除以零。 msdn.microsoft.com/en-us/library/system.double.nan.aspx 谢谢先生,我修复了除以零的列,效果很好!【参考方案3】:您的值之一,Make_Up_Depr
或 a
正在评估为 NaN
。由于这是一个字符串,SQL Server 认为您正在尝试使用该名称引用列。
【讨论】:
以上是关于SQL Server 错误无效的列名“NaN”的主要内容,如果未能解决你的问题,请参考以下文章
将pandas DataFrame写入sql时出现无效列名错误
sql server 2005代码错误 提示插入错误: 列名或所提供值的数目与表定义不匹配。
[Microsoft][ODBC Driver 11 for SQL Server][SQL Server]列名 'user1' 无效