【问题标题】:SQL Update command error in ExecuteNonQueryExecuteNonQuery 中的 SQL 更新命令错误
【发布时间】:2020-03-23 10:08:09
【问题描述】:

当我尝试连接到我的数据库以在 MVC 中编辑数据表时。当我尝试访问我的视图时,执行命令时出现错误。错误是:

System.Data.SqlClient.SqlException: '('附近的语法不正确。 关键字 SET 附近的语法不正确。

但我无法弄清楚我的语法错误。我是初学者,所以我还在学习基础。非常感谢任何帮助。谢谢!。这是我的代码

private void UpdateDataBase(int EmailId, string userName, string title, string Email, string description)
{
    var sqlstring = string.Format("UPDATE Email (Email, Description, UserName, Title) " +
        "SET ('{0}',  '{1}',  '{2}',  '{3}')", Email, description, userName, title +
        "WHERE ID=" + EmailId);

    var myConnection = getconection();
    SqlCommand myCommand = new SqlCommand(sqlstring, myConnection);
    myCommand.ExecuteNonQuery();

    try
    {
        myConnection.Close();
    }
    catch (Exception e)
    {
        Console.WriteLine(e.ToString());
    }
}
public ActionResult Edit (int EmailId, string userName, string title, string Email, string description)
{          
    UpdateDataBase(EmailId, userName, title, Email, description);

    return View("EmailData");
}

[HttpPost]
public ActionResult Edit (ModelTemplateEmail  EditEmailData)
{       
    if (ModelState.IsValid)
    {                
      return RedirectToAction("EmailData");
    };
    return View(EditEmailData);
}

【问题讨论】:

  • 警告:您的代码容易受到 SQL 注入攻击。您应该使用参数化查询和准备好的语句来帮助防止攻击者通过使用恶意输入值来破坏您的数据库。 bobby-tables.com 给出了风险解释,以及如何使用 C# / ADO.NET 安全地编写查询的一些示例。 切勿将未经处理的数据直接插入您的 SQL 中。按照您现在编写代码的方式,有人可以轻松窃取、错误更改甚至删除您的数据。
  • 与问题没有直接关系:您在 GET 函数上调用 UpdateDataBase - 使用 MVC,您通常有一个 GET 可以为您提供输入数据的部分视图,然后是相关的 POST你检查ModelState.IsValid,如果有效,保存数据——所以你的UpdateDatabase调用应该在[HttpPost]重载中。
  • 无论如何,您都需要重新阅读您的教程/示例或其他内容,因为您混淆了 UPDATE 和 INSERT 的查询结构。
  • 对于这个问题,这并不重要,因为您的问题是关于创建 UPDATE 语句。对于您的应用程序,您希望使用用户输入的值进行更新,因此您的 GET 操作只需要 int EmailId 从数据库中获取现有数据,然后在 POST 中使用用户在表单中输入的内容进行更新,使用您的 ModelTemplateEmail 中的值

标签: c# sql asp.net-mvc


【解决方案1】:

你的代码有几个问题

  1. UPDATE 的语法不正确。应该是UPDATE SET columnName = value...
  2. 使用参数化查询,因为此时您的代码容易受到 SQL 注入的攻击
  3. myCommand.ExecuteNonQuery(); 移动到 try 块内以捕获任何异常

请查看我对您的代码的更新:

var sqlstring = @"UPDATE Email SET Email = @email, Description = @description, UserName = @username, Title = @title WHERE ID = @id");

var myConnection = getconection();
SqlCommand myCommand = new SqlCommand(sqlstring, myConnection);

// add parameters
myCommand.Parameters.AddWithValue("@email", email);
myCommand.Parameters.AddWithValue("@description", description);
myCommand.Parameters.AddWithValue("@username", userName);
myCommand.Parameters.AddWithValue("@title", title);
myCommand.Parameters.AddWithValue("@id", emailId);

try
{
    // execute the command in the try block to catch any exceptions
    myCommand.ExecuteNonQuery();
    myConnection.Close();
}
catch (Exception e)
{
    Console.WriteLine(e.ToString());
}

如 cmets 中所述,您确实应该在 HttpPost 方法中执行更新并在调用 UpdateDataBase() 之前验证值。

【讨论】:

  • 谢谢!我有一个错误说 SqlParameterCollectionAdd(string object)' 已经过时了,可以改为 AddWithValue("EmailId",EmailId);
  • 请查看我的更新 - 使用 AddWithValue 而不是 @Maria
  • 听起来您正在为其中一个参数传递一个空值。 email 的值是否为空? @玛丽亚
  • 现在它的工作.. 但不是当我保存它。我会尝试修复它。非常感谢您的帮助和有用的建议,当您独自一人时,有些事情很难理解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
相关资源
最近更新 更多