使用DataTable时如何对列执行计算?

时间:2013-02-23 11:24:43

标签: c# winforms datatable

我需要计算一列的总和并在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();
}

2 个答案:

答案 0 :(得分: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()返回第一行第一列的第一个值。

答案 1 :(得分:0)

目前,您的代码永远不会起作用:

  • 列名是last_retail_price,但您在代码中使用了last_ret_prc。
  • con.close应该是con.Close()。
  • DataTable.Compute接受两个参数“expression”和“filter”。你仍然需要提供第二个参数,即使它是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();