【问题标题】:I am getting an error when I try to update records in my access database当我尝试更新我的访问数据库中的记录时出现错误
【发布时间】:2012-12-16 04:13:05
【问题描述】:

我有一个连接到访问数据库的小程序,我想做的是通过编辑表单更新(编辑)选定的记录。当我执行我的代码时,我得到了这个错误:

System.Data.OleDb.OleDbException was unhandled
  Message=Syntax error (missing operator) in query expression '5346 S. Eubank blvd'.
  Source=Microsoft Access Database Engine
  ErrorCode=-2147217900

不用说,是地址字段..

这是我的代码块:

private void saveChangeBtn_Click(object sender, EventArgs e)
{
    Customer.SetCustID(Convert.ToInt32(editIdTB.Text));
    Customer.SetFirstName(editFirstNameTB.Text);
    Customer.SetLastName(editFirstNameTB.Text);
    Customer.SetAddress(editAddressTB.Text);
    Customer.SetPhoneNum(editPhoneTB.Text);
    Customer.SetEmail(editEmailTB.Text);

    using (OleDbConnection connect = new OleDbConnection(connectionString))
    {
        OleDbCommand cmd = new OleDbCommand();
        connect.Open();

        cmd.Connection = connect;
        cmd.CommandText = "UPDATE Customers SET [Customer ID]=" + Customer.GetCustId() +
            ", [First Name]=" + Customer.GetFirstName() +
            ", [Last Name]=" + Customer.GetLastName() +
            ", [Address]=" + Customer.GetAddress() +
            ", [Phone Number]=" + Customer.GetPhoneNum() +
            ", [Email Address]=" + Customer.GetEmailAddress() + 
            ", WHERE [Customer ID]=" + editIdTB.Text + "";
        cmd.ExecuteNonQuery();
        connect.Close();
        MessageBox.Show("Changes made successfully!", "Success!", MessageBoxButtons.OK);
    }
    this.Close();
}

【问题讨论】:

  • WHERE 前应该有逗号吗?您是否允许用户更改客户 ID?似乎您不想这样做,或者如果是这样,请使用不同的主键。如果您将查询简化为仅更新地址并跳过其余部分,您仍然会遇到相同的错误吗?
  • 将您的 cmd.CommandText 回显到页面或日志文件,这样您就可以看到您正在尝试执行的内容。
  • 我只做了地址并出现此错误: System.Data.OleDb.OleDbException 未处理 Message=Syntax error in string in string in query expression ''5346 S. Eubank blvd WHERE [Customer ID]=3 '。 Source=Microsoft Access 数据库引擎 ErrorCode=-2147217900 StackTrace: at
  • StackTrace:在 System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult) 在 System.Data.OleDb.OleDbCommand 的 System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)。 System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior 行为,Object&executeResult) 处的 ExecuteCommandText(Object&executeResult) System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior,String 方法)
  • 在这些愚蠢的盒子里发帖对我来说太长了

标签: c# ms-access oledb oledbcommand executenonquery


【解决方案1】:

试试这个

cmd.CommandText = "UPDATE Customers SET [First Name]='" + Customer.GetFirstName() +
            "', [Last Name]='" + Customer.GetLastName() +
            "', [Address]='" + Customer.GetAddress() +
            "', [Phone Number]='" + Customer.GetPhoneNum() +
            "', [Email Address]='" + Customer.GetEmailAddress() + 
            "' WHERE [Customer ID]=" + editIdTB.Text;

【讨论】:

  • 成功了!我看到您最后去掉了多余的报价,并删除了客户 ID!出色的!谢谢!
  • 并且在值周围加上引号......没有意识到这也是一个问题!
  • 您可能希望在任何这些值中搜索单引号并将其替换为 2 个单引号,否则您的 SQL 语句将再次中断。
【解决方案2】:

我认为您遇到的问题是 WHERE 之前的逗号。尝试删除它并尝试一下。

如果您可以捕获您正在执行的确切 sql,并尝试在查询浏览器中运行它,那么诊断会更容易。

另外,我建议您在构建 sql 时使用 string.format。如需更好的解决方案,请尝试使用 LINQ to SQL 或实体框架。

【讨论】:

  • 好吧,我把它改了没用......甚至在所有字符串周围添加了单引号并将我的所有值放在括号内,这没有帮助......我会尝试运行它不过,浏览器是个好主意。
【解决方案3】:

您需要在值周围加上引号。这应该解决这里的主要问题。

但是,这里有一个相当大的安全漏洞。 google "sql injection" 你会发现一个坏人可以通过将恶意文本放入editIfTB文本框来严重破坏你的一周

【讨论】:

  • 这只是一个个人项目,不会包含任何敏感数据。但是当我创建更多实质性程序时,我肯定会采纳你的建议。无论如何,我会调查一下,谢谢!
【解决方案4】:

这种方式构造查询除了存在安全漏洞外,仍然存在稳定性问题。一旦您的某个数据字段包含撇号,SQL 将再次中断(例如姓 O'Neill)。最佳实践是通过参数提供所有数据值;它避免了在所有这些单引号/撇号中连接的需要,不会对数据值敏感,也不会存在安全漏洞。

【讨论】:

    最近更新 更多