![](/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.