【问题标题】:SqlCommand SUM(NVL()) issueSqlCommand SUM(NVL()) 问题
【发布时间】:2013-09-04 17:42:15
【问题描述】:

您好,我正在尝试选择所有付款的总和,但出现此异常:nvl 不是可识别的函数名称

使用此代码:

            SqlCommand sc2 = new SqlCommand("SELECT SUM(NVL(payments,0)) AS sumcastka FROM kliplat WHERE akce=" + zakce.Text, spojeni);

            spojeni.Open();

            int sumOfPrice = 0;
            object vysledek2 = sc2.ExecuteScalar();
            if (vysledek2 != DBNull.Value)
                sumOfPrice = Convert.ToInt32(vysledek2);
           // int vysledek2 = Convert.ToInt32(sc2.ExecuteScalar());

            spojeni.Close();

当没有找到“付款”列的记录时,这应该可以工作,如果可能的话,我想得到“0”。

感谢您阅读本文。

【问题讨论】:

    标签: c# sql sql-server winforms


    【解决方案1】:

    NVL() 是一个特定于 oracle 的函数。您可以使用 ANSI COALSECE 函数来执行相同的任务。 COALESCE 的好处是它接受两个以上的参数,并选择第一个非空值。

    【讨论】:

      【解决方案2】:

      当没有为“付款”列找到记录时,这应该可以工作

      不,它只会将 payments 列中的 NULL 值视为 0。

      如果没有找到记录,则ExecuteScalar 返回null(不是DBNull):

      SqlCommand sc2 = new SqlCommand("SELECT SUM(ISNULL(payments,0)) AS sumcastka FROM kliplat WHERE akce=" + zakce.Text, spojeni);
      
      spojeni.Open();
      
      int sumOfPrice = 0;
      object vysledek2 = sc2.ExecuteScalar();
      if (vysledek2 != null && vysledek2 != DBNull.Value)
          sumOfPrice = Convert.ToInt32(vysledek2);
      
      spojeni.Close();
      

      您还应该考虑使用 SqlParameters 而不是连接字符串,但这是一个单独的问题。

      【讨论】:

        【解决方案3】:

        在 SQL Server 中有一个名为 ISNULL 的函数用于此目的。请在下面找到查询:

        SELECT SUM(ISNULL(payments,0)) AS sumcastka FROM kliplat WHERE akce=" + zakce.Text, spojeni
        

        【讨论】:

        • 您好,仅当某些记录为 NULL 时才返回 ISNULL。即使没有找到记录,这也会起作用吗?再次感谢。
        • 您的意思是该行的“付款”列为空白时?
        • Nono,我的意思是当没有选择记录时。如果你明白我的意思。
        • 我认为您应该在代码中实现该条件。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-13
        相关资源
        最近更新 更多