#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:
У вас есть несколько серьезных проблем с вашим кодом.
-
Ваше соединение никогда не закрывается и не утилизируется. Используйте блоки Using, которые будут закрывать и удалять объекты базы данных, даже если произошла ошибка.
-
Вы объединяете строку, чтобы получить свой оператор Sql, рискуя внедрением Sql и повреждением вашей базы данных.
-
Вы добавляете параметр в свою команду, когда в вашей инструкции Sql нет параметров.
-
Вы используете .AddWithValue, который принимает имя параметра и значение параметра в качестве аргументов. Вы предоставили всю свою инструкцию Sql в качестве значения @Name. Это должно быть NameToDelete.Text .
-
Не использовать .Добавить значение. Используйте .Add(имя параметра, тип данных Sql).Значение = значение параметра. Это может ускорить запросы и избежать несоответствий типов в базе данных.
-
Если 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 } } } }