Ryuto Torres Ответов: 2

Что не так в моих кодах? Тогда все еще было в порядке


public void del()
  {
      MySqlConnection MyConnection = new MySqlConnection(MyConnectionString);
      MySqlCommand cmd4;
      MySqlDataReader mdr;

      MyConnection.Open();

      string selectQuery = "DELETE FROM `newdoc` where docid =" + int.Parse(delsear.Text);
      cmd4 = new MySqlCommand(selectQuery, MyConnection);

      mdr = cmd4.ExecuteReader();
      if (mdr.Read())
      {

      }
      else
      {
          MessageBox.Show("Delete Successful.");
      }
      MyConnection.Close();
  }


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

string selectQuery = "DELETE FROM `newdoc` where docid =" + int.Parse(delsear.Text);
в этой строке говорится, что исключение формата было необработано

Richard MacCutchan

Почему вы пытаетесь разобрать строку (текст) в целое число, просто чтобы ее можно было преобразовать обратно в строку?

2 Ответов

Рейтинг:
7

Jochen Arndt

Возможно delsear.Text не содержит строки, которая может быть преобразована в int Если это происходит, то создается исключение, которое не обрабатывается вашим кодом.

Чтобы избежать исключений, вызовите Типа int32.Метод TryParse (String, Int32) (System)[^] перед созданием строки запроса с помощью переменной и проверкой возвращаемого значения:

int docid;
if (!Int32.TryParse(delsear.Text, out docid))
{
    // handle / report error here
    return;
}
string selectQuery = "DELETE FROM `newdoc` where docid =" + docid;


Ryuto Torres

спасибо ошибка исчезла но удаление не работает

Jochen Arndt

См. Решение 1: Вы должны использовать ExecuteNonQuery вместо ExecuteReader.

Рейтинг:
1

Richard Deeming

Это означает, что введенный пользователем текст не является допустимым целым числом. Воспользуйся инт.Метод tryparse[^] чтобы попытаться разобрать текст и отобразить ошибку, если она недопустима.

Вам следует избегать использования конкатенации строк для построения ваших запросов. В данном конкретном случае, поскольку параметр известен как целое число, вы, вероятно, в порядке. Но это плохая привычка, чтобы попасть в нее, и приводит к SQL-инъекция[^] факторы уязвимости.

Кроме того, вы не хотите использовать ExecuteReader для команды insert, update или delete, так как они ничего не возвращают. Воспользуйся ExecuteNonQuery вместо.

И, наконец, вы должны завернуть одноразовые предметы в using блоки, чтобы гарантировать, что их ресурсы всегда очищаются должным образом.

public void del()
{
    int docid;
    if (!int.TryParse(delsear.Text, out docid))
    {
        MessageBox.Show("Please enter a valid ID.");
        return;
    }
    
    using (MySqlConnection MyConnection = new MySqlConnection(MyConnectionString))
    using (MySqlCommand cmd4 = new MySqlCommand("DELETE FROM `newdoc` where docid = @docid", MyConnection))
    {
        cmd4.Parameters.AddWithValue("@docid", docid);
        
        MyConnection.Open();
        cmd4.ExecuteNonQuery();
    }
    
    MessageBox.Show("Delete Successful.");
}



Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]


Karthik_Mahalingam

5