我想在收入表中汇总金额值,其中从文本框输入日期。
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;
}
我的金额数据类型是十进制
答案 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
完全不同......