Я хочу суммировать все значения столбца (ttl
) и сохранить результат в переменной (сумма). Я пробовал некоторые фрагменты кода, но не добился успеха.
SqlCommand cmd1 = new SqlCommand("Select sum(ttl) from feereceipt where std_id = '"+ textBox1.Text +"'",con);
SqlDataReader dr = cmd1.ExecuteReader();
while (dr.Read())
{
sum = Convert.ToInt32(dr[0]);
MessageBox.Show(sum.ToString());
con.Close();
}
Ничего плохого ?
Какой тип данных std_id
?
В вашем коде вы должны закрыть соединение после цикла, закрытие соединения внутри цикла вызовет ошибку:
while (dr.Read())
{
sum = Convert.ToInt32(dr[0]);
MessageBox.Show(sum.ToString());
}
con.Close();
Сумма должна возвращать одно значение, поэтому вы можете просто получить значение следующим образом:
int sum = Convert.ToInt32(cmd1.ExecuteScalar());
Добавление переменной непосредственно в запрос делает его уязвимым для инъекций. Вместо этого используйте параметры:
SqlCommand cmd1 = new SqlCommand("Select sum(ttl) from feereceipt where std_id = @id",con);
cmd1.Parameters.Add("@id", SqlDbType.VarChar).Value = textBox1.Text;
нет, не должен, потому что он закрывает соединение внутри цикла, в котором второй раз, когда он проверяется на dr.Read()
, он должен вызвать ошибку
Он не будет зацикливаться во второй раз, если у него есть одна строка. Это очень небрежно, но технически это сработает. Скорее всего параметр является int.
@Crowcoder, он проверяет, верно ли dr.Read()
(это должно быть ложно, как вы знаете), но на этот раз соединение закрывается.
Верно. Я понял.
Я также добавил пример инъекции, которую можно сделать, добавив запрос таким образом в этом вопросе https://stackoverflow.com/questions/55260242/how-to-insert-decimal-value-from-textbox-into-database-with-c-sharp
int sum = (int)cmd1.ExecuteScalar(); возвращает, указанное приведение недействительно
@RadhaKhare как насчет этого?
@AshkanMobayenKhiabani, все идет хорошо, но я столкнулся с проблемой, когда я передаю результат запроса в переменную, я пробовал то, что вы предложили, но получаю сообщение об ошибке «указанное приведение недопустимо»
int sum = Convert.ToInt32(cmd1.ExecuteScalar());
не работает?
если это не работает, это означает, что тип данных ttl
не является int
, float
может быть
@AshkanMobayenKhiabani, позвольте мне проверить
@AshkanMobayenKhiabani, тип данных ttl — числовой
in знаю его числовое значение, но это тип int или он имеет плавающую точку? как поплавок или реальный
@AshkanMobayenKhiabani, наконец, 'int sum = Convert.ToInt32(cmd1.ExecuteScalar());' работал
Можете ли вы описать, что происходит не так?