![](/img/trans.png)
[英]Why am I getting this error when trying to update an Access Database file (.mdb) with a Datatable:
[英]I am getting an error when I try to update records in my access database
我有一个连接到访问数据库的小程序,我想要做的是通过编辑表单更新(编辑)选定的记录。 当我执行代码时,出现以下错误:
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之前的逗号。 尝试删除它,然后尝试一下。
如果您可以捕获正在执行的确切sql并尝试在查询浏览器中运行它,则诊断起来会更容易。
另外,建议您在构造sql时使用string.format。 为了获得更好的解决方案,请尝试使用LINQ to SQL或Entity Framework。
尝试这个
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;
您需要在值两边加上引号。 应该可以解决这里的主要问题。
但是,您这里有一个相当大的安全漏洞。 谷歌“ SQL注入”,你会发现一个坏人可以通过将恶意文本放入editIfTB文本框来严重破坏你的一周
除了安全漏洞之外,以这种方式构造查询仍然会存在稳定性问题。 只要您的数据字段之一包含撇号,SQL就会再次中断(例如,姓O'Neill)。 最佳实践是通过参数提供所有数据值。 它避免了将所有这些单引号/单引号连接在一起的需要,对数据值不敏感,也没有安全漏洞。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.