我尝试更新访问数据库中的记录时收到错误

时间:2012-12-16 04:13:06

标签: c# ms-access oledb oledbcommand executenonquery

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

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();
}

4 个答案:

答案 0 :(得分:0)

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

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

另外,我建议你在构造sql时使用string.format。要获得更好的解决方案,请尝试使用LINQ to SQL或Entity Framework。

答案 1 :(得分:0)

试试这个

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;

答案 2 :(得分:0)

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

但是,你在这里有一个非常巨大的安全漏洞。谷歌“sql注入”,你会发现一个坏人可以通过将恶意文本放入editIfTB文本框来严重破坏你的一周

答案 3 :(得分:0)

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