2013-03-18 4 views
0

Спасибо за помощь. Все вы (буквально)delete string combobox item C#

Я проверил другую часть своего кода, где я обновлял запись, и использовал этот код и модифицировал его. Сейчас он работает

Здесь

string sql = "DELETE from Login WHERE UserName = '" + comboBox1.SelectedItem.ToString() + "'"; 

      SqlCommand cmd = conn.CreateCommand(); 
      cmd.CommandType = CommandType.Text; 
      cmd.CommandText = sql; 


      cmd.Parameters.Add(new SqlParameter("@UserName", comboBox1.SelectedItem.ToString())); 
      int rowdel = cmd.ExecuteNonQuery(); 
      MessageBox.Show("Done!"); 

Это мой код для удаления конкретной строки из базы данных, выбранные с помощью выпадающего списка. Мой учитель использовал этот же код, и его программа работала. Однако он показывает ошибку на:

"ИНТ rowInserted = cmd.ExecuteNonQuery();"

это говорит

необработанное исключение типа 'System.Data.SqlClient.SqlException' произошел в System.Data.dll Дополнительная информация: Неправильный синтаксис рядом с '='.

вот мой код:

private void button1_Click(object sender, EventArgs e) 
     { 
      string connectionString = "Server = HP-PC\\SQLExpress; Database = CProject; Trusted_Connection = True"; 
      SqlConnection conn = new SqlConnection(); 
      conn.ConnectionString = connectionString; 
      conn.Open(); 

      string sql = "delete from [Login] where UserName = " + comboBox1.SelectedText.ToString(); 

      SqlCommand cmd = conn.CreateCommand(); 
      cmd.CommandType = CommandType.Text; 
      cmd.CommandText = sql; 

      int rowInserted = cmd.ExecuteNonQuery(); 
      label7.Text = rowInserted.ToString(); 

      conn.Close(); 


     } 

     private void AddDeleteUsers_Load(object sender, EventArgs e) 
     { 
      string connectionstring = "Server=HP-PC\\SQLExpress;Database=CProject;Trusted_Connection=True;"; 
      SqlConnection conn = new SqlConnection(); 
      conn.ConnectionString = connectionstring; 
      conn.Open(); 

      SqlCommand cmd = conn.CreateCommand(); 
      cmd.CommandType = CommandType.Text; 
      cmd.CommandText = "select UserName from Login"; 

      SqlDataReader reader = cmd.ExecuteReader(); 

      while (reader.Read()) 
      comboBox1.Items.Add(reader["UserName"].ToString()); 
      reader.Close(); 

      conn.Close(); 
     } 
+0

Вы также открыты для атак внедрения SQL, так что ожидать волну людей, сообщающую, что. У вас также есть SQL (в переменной, называемой 'sql'), которая запускается, берет ее, запускает ее в базе данных * самостоятельно *, она работает? Значение 'comboBox1.SelectedText.ToString()' - это что? – Arran

+0

Какова была стоимость имени, которое вы указали? –

+1

При сравнении строки она должна быть окружена кавычками. Альтернативно посмотрите на предоставление параметров вашей команде SQL вместо – CR41G14

ответ

4

Я дам вам подсказку.

Сообщение об ошибке в коде SQL, в этой строке:

string sql = "delete from [Login] where UserName = " + comboBox1.SelectedText.ToString(); 

Проблемы в том, что SQL нуждается текст в одинарных кавычках, например 'text' ...

без предоставления ответа (так как это домашнее задание) Я думаю, это дает вам достаточно, чтобы понять это?

Редактировать «по многочисленным просьбам»

Кстати, одна из причин того, что не рекомендуется, чтобы просто взять значение из HTML ввода (ваш ComboBox) является то, что она может быть манипулируют вредоносного человека и заменен кодом SQL, который известен как SQL Injection.

Чтобы этого избежать, рекомендуется использовать параметры.

Примером может быть

string sql = "delete from [Login] where UserName = @UserName" 

Тогда вы должны добавить параметр к вашей команде, прежде чем выполнить ее

command.Parameters.AddWithValue("@UserName", comboBox1.SelectedText.ToString()); 

Это предотвращает кого-то из мутирует ваш SQL заявление в нечто зловещее.

+0

-1 для того, чтобы не предполагать, что OP использует параметризованный запрос –

+0

+1 для обучения и не дает ответа, так как это – CR41G14

+1

@MarkKram, вы думаете, что ОП находится в этом пункте его исследований? Все в нужное время ... он не пишет критическое деловое приложение, а просто пытается изучить веревки. –

2

Изменить

string sql = "delete from [Login] where UserName = " + comboBox1.SelectedText.ToString(); 

к этому

string sql = "delete from [Login] where UserName = '" + comboBox1.SelectedText.ToString() + "'"; 

Вы нужны одиночные кавычки вокруг текста.

+0

Я пробовал это раньше, и я попробовал еще раз. Это не дает ошибок, но не удаляет строку. –

+0

Ну, что такое значение 'comboBox1.SelectedText.ToString()'? Он существует в вашей базе данных? –

+0

-1 для того, чтобы не предполагать, что OP использует параметризованный запрос –

1

Попробуйте это:

string sql = "delete from [Login] where UserName = '" + comboBox1.SelectedText.ToString() + "'"; 

Лучше использовать SqlParameter, чтобы избежать SQL Injection.

 string sql = "delete from [Login] where UserName = @username"; 

     SqlCommand cmd = conn.CreateCommand(); 
     cmd.CommandType = CommandType.Text; 
     cmd.CommandText = sql; 
     cmd.Parameters.AddWithValue("@username", comboBox1.SelectedText.ToString()); 

     int rowInserted = cmd.ExecuteNonQuery(); 
1
string sql = "delete from [Login] where UserName = '" + comboBox1.SelectedText.ToString()+ "'"; 

лучше, нет?

Будьте осторожны с воспламенением Sql, кстати ...

+0

-1, не говоря о том, что OP использует параметризованный запрос –

+0

Спасибо за парней, я определенно считаю, что это справедливо! – Thomas

+0

Томас, я на самом деле не проголосовал за вас, я просто заявил об этом в своем комментарии. Я, как правило, публикую голосовые сообщения, если что-то действительно не так. Я просто поддержал ваш пост. –

0

Для предотвращения инъекций атак SQL вы должны использовать параметризованный запрос:

string connectionString = "Server = HP-PC\\SQLExpress; Database = CProject; Trusted_Connection = True"; 
    using (SqlConnection conn = new SqlConnection(connectionString)) 
    { 
     conn.Open(); 
     string sql = "delete from [Login] where UserName = @UserName;"; 

     using (SqlCommand cmd = new SqlCommand(sql, conn)) 
     { 
      SqlParameter p = new SqlParameter("UserName", comboBox1.SelectedText.ToString()); 
      cmd.Parameters.Add(p); 
      cmd.ExecuteNonQuery(); 
     } 
    } 
+0

Это не дает никакой ошибки, но не удаляет строку. –