Команда sum () не возвращает добавленную стоимость из таблицы
Я хочу суммировать значение суммы в таблице доходов, где дата была введена из текстового поля.
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 ответа
Я не вижу смысла использовать ExecuteReader
в твоем случае. использование ExecuteScalar
вместо этого именно то, что вам нужно, потому что ваш запрос возвращает только один столбец с одной строкой.
Выполняет запрос и возвращает первый столбец первой строки в наборе результатов, возвращенных запросом.
И вы всегда должны использовать parameterized queries
, Этот тип конкатенации строк открыт для атак SQL-инъекций.
Например;
SqlCommand cmd = new SqlCommand("select sum(amount) from income where date = @date", con);
cmd.Parameters.AddWithValue("@date", TextBox15.Text);
TextBox16.Text = cmd.ExecuteScalar().ToString();
Прежде всего, параметризованные запросы пользователей, чтобы избежать атак внедрения 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
потому что будет возвращен только один результат.
Проблема: нет колонки 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;
}
Почему бы вам просто не сделать это:
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
...