我有这种编辑数据的方法,但我不知道如何编写代码...到现在为止,我有这个我不太懂的,我有一个错误。它说incorrect syntax near '('
。
public void EditMember(Member member)
{
string Name = member.Name;
string Surname = member.Surname;
string EntryDate = member.EntryDate.ToString("dd.MM.yyyy");
string Status = member.Status;
sqlConnection.Open();
sqlCommand = new SqlCommand(
"UPDATE Members SET (Name, Surname, EntryDate) VALUES('" + Name + "','" + Surname + "','" + EntryDate + "')' WHERE'(' Id '='" + member.Id + "')",
sqlConnection);
sqlCommand.ExecuteNonQuery();
sqlConnection.Close();
}
问题在于我开始写WHERE
请帮助。
答案 0 :(得分:3)
请阅读所有这些答案,而不仅仅是第一部分
这里有很多问题。最立即问题出在此处:
"')' WHERE'('
这就像你试图引用括号一样。那“应该”:
"') WHERE ('
此时它看起来像一个有效的(但很糟糕的)INSERT
命令......但你使用VALUES
看起来不像是在T-SQL中更新的有效方法反正。
但是,你根本不应该使用这种方法。它容易出错,难以阅读,最重要的是容易SQL injection attacks。
相反,您应该使用参数化SQL:
string sql = @"UPDATE Members
SET Name = @Name, Surname = @Surname, EntryDate = @EntryDate
WHERE Id = @Id";
using (var connection = new SqlConnection(...))
{
connection.Open();
using (var command = new SqlCommand(sql, connection))
{
command.Parameters.Add("@Name", SqlDbType.NVarChar).Value = member.Name;
command.Parameters.Add("@Surname", SqlDbType.NVarChar).Value = member.Surname;
command.Parameters.Add("@EntryDate", SqlDbType.DateTime).Value = member.EntryDate;
command.Parameters.Add("@Id", SqlDbType.NVarChar).Value = member.Id;
int rows = command.ExecuteNonQuery();
// TODO: Work out what to do if rows isn't 1
}
}
(当然,需要调整适当的数据类型。)
答案 1 :(得分:1)
更新语句的正确语法是
"UPDATE Members SET Name = @name, Surname = @surname, EntryDate = @date WHERE id=@id"
说,你应该像这样使用参数化查询
public void EditMember(Member member)
{
string Name = member.Name;
string Surname = member.Surname;
string EntryDate = member.EntryDate.ToString("dd.MM.yyyy");
string Status = member.Status;
sqlConnection.Open();
sqlCommand = new SqlCommand("UPDATE Members SET Name = @name, Surname = @surname, " +
"EntryDate = @date " +
"WHERE Id = @id", sqlConnection);
sqlCommand.Parameters.AddWithValue("@name", Name);
sqlCommand.Parameters.AddWithValue("@surname", Surname);
sqlCommand.Parameters.AddWithValue("@date", EntryDate);
sqlCommand.Parameters.AddWithValue("@id", Status);
sqlCommand.ExecuteNonQuery();
sqlConnection.Close();
作为旁注,请记住,AddWithValue是一种向查询添加参数的简单方法,但如果此查询的性能至关重要,最好使用完全定义的参数,其数据类型与数据库完全匹配列的类型和确切的大小。
答案 2 :(得分:1)
您应该 从不 将您的SQL语句与用户输入连接在一起。
相反:使用参数化查询 - 它们易于使用,避免SQL注入,并提高性能。
尝试使用以下代码:
string updateStmt = "UPDATE dbo.Members SET Name = @Name, Surname = @Surname, EntryDate = @EntryDate WHERE Id = @ID";
sqlCommand = new SqlCommand(updateStmt, sqlConnection);
sqlCommand.Parameters.Add("@Name", SqlDbType.VarChar, 100).Value = name;
sqlCommand.Parameters.Add("@Surname", SqlDbType.VarChar, 100).Value = surname;
sqlCommand.Parameters.Add("@EntryDate", SqlDbType.DateTime).Value = entrydate;
sqlCommand.Parameters.Add("@ID", SqlDbType.Int).Value = member.Id;
sqlConnection.Open();
sqlCommand.ExecuteNonQuery();
sqlConnection.Close();
答案 3 :(得分:0)
删除WHERE
周围的引号,您应该没问题。请注意有关SQL注入攻击的评论中给出的警告。
答案 4 :(得分:0)
您的代码存在更新语法错误以及SQLInjection问题。
您需要传递参数以更新查询,而不是传递直接值。
应该如下:
public void EditMember(Member member)
{
string Name = member.Name;
string Surname = member.Surname;
string EntryDate = member.EntryDate.ToString("dd.MM.yyyy");
string Status = member.Status;
sqlConnection.Open();
sqlCommand = new SqlCommand("UPDATE Members SET Name=@Name, Surname=@Sirname, EntryDate=@EntryDate WHERE Id = @id", sqlConnection);
sqlCommand.parameters.AddparameterWithValue("@Name",Name);
sqlCommand.parameters.AddparameterWithValue("@Surname",Surname);
sqlCommand.parameters.AddparameterWithValue("@EntryDate",EntryDate);
sqlCommand.parameters.AddparameterWithValue("@Id",Id);
sqlCommand.ExecuteNonQuery();
sqlConnection.Close();
}
答案 5 :(得分:-1)
编辑帖子以做出正确答案:
即。你不需要where子句中的括号。是的,更好的查询是
"UPDATE Members SET Name=@Name, Surname=@Surname, EntryDate=@EntryDate WHERE Id=@ID"
然后通过命令对象的参数添加@ Name,@ Hotame,..等。