【问题标题】:SQL Server Error Invalid column name 'NaN'SQL Server 错误无效的列名“NaN”
【发布时间】:2023-04-03 05:31:01
【问题描述】:

我有点问题。我从我的程序的 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 是等式的结果。

标签: c# sql-server nan


【解决方案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 正在尝试将其评估为列名/别名(因为它不是双精度值......)

    【讨论】:

    【解决方案3】:

    您的值之一,Make_Up_Depra 正在评估为 NaN。由于这是一个字符串,SQL Server 认为您正在尝试使用该名称引用列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-13
      • 2019-09-05
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      • 2015-03-28
      • 2013-03-01
      相关资源
      最近更新 更多