Удаление строки ADO.Net, ASP.Net

#c# #asp.net #ado.net

#c# #asp.net #ado.net

Вопрос:

Я пытаюсь работать со списком контактов и хочу удалить всю информацию о человеке, когда я набираю его имя. Я использую таблицу sql с именем Contact, которая содержит имя, электронную почту и адрес контакта. У меня есть следующий код:

     protected void Delete_Click(object sender, EventArgs e)
    {
        SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["dbconnect"].ConnectionString);
        con.Open();
        string delete = "DELETE FROM Contact WHERE Name ="   NameToDelete.Text;
        SqlCommand cmd = new SqlCommand(delete, con);



        try
        {
            cmd.Parameters.AddWithValue("@Name", delete);
            cmd.ExecuteNonQuery();
            Response.Redirect("ViewContacts.aspx");
        }
        catch(Exception ex)
        {
            Response.Write(ex);
        }


    }
  

Когда я использую это, кажется, что сравнивается имя столбца с именем, которое я ввожу. Таким образом, счет за имя сравнивается с именем заголовка столбца, а не с тем, что содержится в названии.

Ответ №1:

Вам нужно использовать одинарные кавычки вокруг значений с типами var (char). Если вы не используете кавычки, он будет думать, что вы ссылаетесь на имя столбца вместо значения. Это действительно для всех баз данных, следующее взято из oracle docs:

символьные литералы заключены в одинарные кавычки, которые позволяют Oracle отличать их от имен объектов схемы.

https://docs.oracle.com/cd/A87860_01/doc/server.817/a85397/sql_elem.htm

 string delete = "DELETE FROM Contact WHERE Name ='"   NameToDelete.Text   "'";
  

На самом деле то, что вы пытаетесь сделать, это использовать параметр sqlcommand, затем вам нужно использовать имя параметра, используя @[ParameterName] в инструкции sql.

 string delete = "DELETE FROM Contact WHERE Name = @Name";
  

Комментарии:

1. Это правда, если вы добавляете параметр, убедитесь, что вы его используете! Если вы не планируете его использовать, существует много кода, который не имеет смысла!

2. @AntonioRodriguez вы правы, я понял, что использование параметра после этих строк. Предпочтительным способом, конечно, является использование параметров по соображениям безопасности (против внедрения sql).

3. Хорошо, я немного повозился с этим и заставил его работать с параметрами. Добавьте значение(«@NameToDelete», NameToDelete. Текст); Кажется, так намного чище. Спасибо!

Ответ №2:

Похоже, ваша проблема в том, что вы используете переменную delete в двух экземплярах. Во-первых, для создания команды, которая подходит, а во-вторых, как значение параметра, которое неверно. В значении параметра, вероятно, вы должны использовать значение t, которое вы хотите удалить.

Ответ №3:

У вас есть несколько серьезных проблем с вашим кодом.

  1. Ваше соединение никогда не закрывается и не утилизируется. Используйте блоки Using, которые будут закрывать и удалять объекты базы данных, даже если произошла ошибка.

  2. Вы объединяете строку, чтобы получить свой оператор Sql, рискуя внедрением Sql и повреждением вашей базы данных.

  3. Вы добавляете параметр в свою команду, когда в вашей инструкции Sql нет параметров.

  4. Вы используете .AddWithValue, который принимает имя параметра и значение параметра в качестве аргументов. Вы предоставили всю свою инструкцию Sql в качестве значения @Name. Это должно быть NameToDelete.Text .

  5. Не использовать .Добавить значение. Используйте .Add(имя параметра, тип данных Sql).Значение = значение параметра. Это может ускорить запросы и избежать несоответствий типов в базе данных.

  6. Если name является вашим первичным ключом, все в порядке, но если нет, вам следует удалить с помощью первичного ключа или отправить все значения в предложении Where.

     protected void Delete_Click(object sender, EventArgs e)
    {
        using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["dbconnect"].ConnectionString))
        {
    
            string delete = "DELETE FROM Contact WHERE Name = @Name;"; //no single quotes to worry about
            using (SqlCommand cmd = new SqlCommand(delete, con))
            {
                cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = NameToDelete.Text; //just guessed at the VarChar - check your database for type
                try                  
                {           
                    con.Open();
                    cmd.ExecuteNonQuery();
                    Response.Redirect("ViewContacts.aspx");
                }
                catch (Exception ex)
                {
                    Response.Write(ex.Message); //ex by itself, will get you nothing but the fully qualified name of Exception
                }
            }
        }
    }