Команда 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...

Другие вопросы по тегам