Member 12794759 Ответов: 1

Выберите sum() с помощью if else C#


Я хочу выбрать сумму значений столбцов в таблице базы данных MySql и показать результат в текстовом поле, если результат больше 0, иначе выведите 0 в текстовом поле, если в столбце ничего нет, но код приносит утверждение, что "входная строка была не в правильном формате" вместо 0 всякий раз, когда в столбце ничего нет. Любая помощь, пожалуйста!

Что я уже пробовал:

try
{
   MySqlConnection connection = new MySqlConnection("datasource=localhost;username=root;password=");
   connection.Open();
   string str = "select sum(amount_received_today) from cmmf.budgeted_income where received_from ='" +
        this.txtRfrom_Income.Text + "'";
   MySqlCommand com = new MySqlCommand(str, connection);
   int count = Convert.ToInt32(com.ExecuteScalar().ToString());
   connection.Close();
   if (count == 0)
   {
      txtRamount_Income.Text = "0"
   }
   else
   {
      txtRamount_Income.Text = "" + count;
   }
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

Richard MacCutchan

Используйте свой отладчик, чтобы увидеть, какое значение фактически возвращается из вызова ExecuteScalar. И не используйте Convert.ToInt32 используйте Int32.Попробуй вместо этого спарситься.

1 Ответов

Рейтинг:
0

Patrice T

Цитата:
но код приносит утверждение, что "входная строка была не в правильном формате" вместо 0

Наряду с точным сообщением об ошибке, положение ошибки также помогает понять, что не так.
Блок try/catch-это, конечно, хорошая вещь, но он также не позволяет программе сообщить вам, в чем проблема.
-----
int count = Convert.ToInt32(com.ExecuteScalar().ToString());

ExecuteScalar() возвращает числовое значение, которое преобразуется в строку и повторно преобразуется в целое число. Если значение ExecuteScalar() не было целым числом, вы получите ошибку.
Попробуй
int count = com.ExecuteScalar();

Совет: используйте отладчик для того, что вы кодируете, и посмотрите, где что-то идет не так.
-----
string str = "select sum(amount_received_today) from cmmf.budgeted_income where received_from ='" +this.txtRfrom_Income.Text + "'";

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]


0x01AA

Извините еще раз меня с 3. С моей точки зрения бесполезно показывать инъекцию, не давая решения вопроса.

Patrice T

Так будет лучше ?

0x01AA

намного больше ;)