sum()命令不返回表中的添加值

时间:2013-11-22 09:00:54

标签: c# sqldatareader

我想在收入表中汇总金额值,其中从文本框输入日期。

try
{
    con.Open();
    SqlDataReader myReader = null;            
    SqlCommand cmd = new SqlCommand("select sum(amount) from income where date='" + TextBox15.Text + "'", con);
    myReader = cmd.ExecuteReader();
    while (myReader.Read())
    {
        TextBox16.Text = (myReader["amount"].ToString());
    } 
    con.Close();

}
catch (Exception e1)
{
    Label1.Text = e1.Message;
}

我的金额数据类型是十进制

4 个答案:

答案 0 :(得分:4)

我认为没有理由在您的案例中使用ExecuteReader。请改为使用ExecuteScalar,因为您的查询只返回一行一行。

  

执行查询,返回第一行的第一列   查询返回的结果集。

你应该总是使用parameterized queries。这种字符串连接对 SQL Injection 攻击开放。

例如;

SqlCommand cmd = new SqlCommand("select sum(amount) from income where date = @date", con);
cmd.Parameters.AddWithValue("@date", TextBox15.Text);
TextBox16.Text = cmd.ExecuteScalar().ToString();

答案 1 :(得分:2)

首先是用户参数化查询,以避免SQL注入攻击。

您的结果中没有列amount,要么为您的聚合结果添加别名,要么只从读者返回第一个值。

try
{ 
   con.Open();
   SqlDataReader myReader = null;

   SqlCommand cmd = new SqlCommand("select sum(amount) from income where date = @date", con);
   cmd.Parameters.AddWithValue("@date", TextBox15.Text);

   myReader = cmd.ExecuteReader();

   if (myReader.Read())
   {
       TextBox16.Text =myReader[0].ToString();
   }

   con.Close();

}
catch (Exception e1)
{
   Label1.Text = e1.Message;
}

同时将while更改为if,因为只会返回一个结果。

答案 2 :(得分:1)

问题:没有列amount。 所以使用如下的别名:

示例:

select sum(amount) as totalamount from income where date=@datevalue

=>避免sql注入攻击使用参数化查询:

完整解决方案:更改您的代码如下:

try
    {
        con.Open();

        SqlDataReader myReader = null;

        SqlCommand cmd = new SqlCommand("select sum(amount) as totalamount from income where date=@datevalue", con);
        cmd.Parameters.Add(new SqlParameter("@datevalue", TextBox15.Text));
        myReader = cmd.ExecuteReader();

        while (myReader.Read())
        {
            TextBox16.Text = (myReader["totalamount"].ToString());
        } 
        con.Close();

    }
    catch (Exception e1)
    {
        Label1.Text = e1.Message;
    }

答案 3 :(得分:1)

你为什么不这样做:

try
{ 
   con.Open();

   SqlCommand cmd = new SqlCommand("select isnull(sum(amount),0) from income where date = @date", con);
   cmd.Parameters.AddWithValue("@date", TextBox15.Text);

   TextBox16.Text = cmd.ExecuteScalar().ToString();

   con.Close();

}
catch (Exception e1)
{
   Label1.Text = e1.Message;
}

如果你能找到时间,试着给你的对象一些合理的名字,与TextBox16完全不同......