【问题标题】:How do I perform a calculation on a column when using a DataTable?使用 DataTable 时如何对列执行计算?
【发布时间】:2013-02-09 00:05:06
【问题描述】:

我需要计算一列的总和并将其显示在total.Text 中。我怎样才能做到这一点?此列有无限的数据,可以随时更改。我正在使用VS2010。我是 C# 新手。

例子:

_____________________
| last_retail_price |
---------------------
|      500          |
|      200          |
|      5.60         |
---------------------
total.Text = 705.6  \\ The sum of column which I need

我的代码:

private void add_click(object sender, EventArgs e) 
    SqlConnection con = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=D:\\fuda\\Fuda.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
    SqlDataAdapter da = new SqlDataAdapter();
    DataTable tl = new DataTable();
    da.SelectCommand = new SqlCommand("Select last_ret_prc from pur_temp", con);
    con.Open();
    da.Fill(tl);

    object sum_obj;
    sum_obj = tl.Compute("sum(last_ret_prc)");
    total.Text = sum_obj.ToString();
    con.close();
}

【问题讨论】:

    标签: c# winforms datatable


    【解决方案1】:

    类似这样的:

    var con = new SqlConnection(/*your connection string*/);
    var cmd = conn.CreateCommand();
    cmd.CommandText = @"Select Sum(last_ret_prc) FROM pur_temp GROUP BY last_ret_prc";
    string sum_obj = cmd.ExecuteScalar().ToString();
    
    total.Text = sum_obj;
    
    con.Dispose();
    

    现在 SQL 查询只返回一个值。 last_ret_prc 的总和。 方法ExecuteScaler() 返回第一行第一列的第一个值。

    【讨论】:

      【解决方案2】:

      就目前而言,您的代码永远无法工作:

      • 列名为 last_retail_price,但您在代码中使用了 last_ret_prc。
      • con.close 应该是 con.Close()。
      • DataTable.Compute 采用两个参数“表达式”和“过滤器”。您仍然需要提供第二个参数,即使它为 null。

      我已经清理了代码并在本地测试了它,它工作正常:

      SqlConnection con =
          new SqlConnection(
              @"Data Source=.\SQLEXPRESS;AttachDbFilename=D:\fuda\Fuda.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
      SqlDataAdapter da = new SqlDataAdapter();
      DataTable tl = new DataTable();
      da.SelectCommand = new SqlCommand("Select last_retail_price from pur_temp", con);
      con.Open();
      da.Fill(tl);
      
      object sum_obj = tl.Compute("sum(last_retail_price)", null);
      total.Text = sum_obj.ToString();
      con.Close();
      

      或者,如果您只希望显示总数,您可能最好在一个 SqlCommand 中执行此操作:

      con.Open();
      var command = new SqlCommand("SELECT SUM(last_retail_price) FROM pur_temp", con);
      var result = command.ExecuteScalar();
      total.Text = result.ToString();
      con.Close();
      

      【讨论】:

      • 这里它在下面的行对象中给我错误 sum_obj = tl.Compute("sum(last_retail_price)", null); \\聚合函数 Sum() 和类型的无效使用:字符串。上述所有编码中的相同错误甚至我的也是......
      • 您数据库中的last_retail_price 必须是数字类型 - decimal(18,2)。我怀疑您当前正在存储一个字符串(char/nchar/varchar/nvarchar)?该错误表明您正在尝试对字符串求和 - Sum(500, 200, 5.60) 有效,而 Sum("500", "200", "5.60") 无效。
      • 我有另一个想法,你可以帮助我思考:int a = column1 & row 1,int 2 = column1 & row 2,int 3 = column1 & row 3 等等至少 20我的意思是同一列但不同的行然后将所有 int 相加,例如 total.text = 1+2+3+4+5.....20 有可能吗??
      • 这里我在 datable 中使用 VarChar(Max) 作为 last_ret_prc 是错误的。非常感谢你们俩
      猜你喜欢
      • 2017-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多