0

我有这种编辑数据的方法,但我不知道如何编写代码......直到现在我有这个我不太了解并且我有一个错误。它说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

请帮忙。

4

6 回答 6

3

请阅读所有此答案,而不仅仅是第一部分

这里有多个问题。最直接的问题在这里:

"')' WHERE'('

这就像你试图引用括号一样。那“应该”是:

"') WHERE ('

在那一点上,它看起来像是一个有效(但不好)INSERT的命令......但是你使用VALUES它看起来不像是在 T-SQL 中更新的有效方式。

但是,您根本不应该使用这种方法。它容易出错,难以阅读,最重要的是容易受到SQL 注入攻击

相反,您应该使用参数化 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
    }
}

(当然,需要对适当的数据类型进行调整。)

于 2013-06-05T11:43:57.790 回答
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 是一种向查询添加参数的简单方法,但如果此查询的性能至关重要,则最好使用完全定义的参数,其数据类型与您的数据库列的类型完全匹配并且与确切的大小。

于 2013-06-05T11:42:56.390 回答
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();
于 2013-06-05T11:44:59.417 回答
0

删除周围的引号WHERE,你应该没问题。请注意关于 SQL 注入攻击的评论中给出的警告。

于 2013-06-05T11:44:53.630 回答
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();
}
于 2013-06-05T11:45:55.893 回答
-1

编辑帖子以做出正确答案:

即在where 子句中不需要括号。是的,更好的查询是

  "UPDATE Members SET Name=@Name, Surname=@Surname, EntryDate=@EntryDate WHERE  Id=@ID" 

然后通过命令对象的参数添加@Name、@Surname、.. 等。

于 2013-06-05T11:45:13.483 回答