2012-12-16 156 views
1

我有一個連接到訪問數據庫的小程序,而我正在嘗試執行的操作是通過編輯表單更新(編輯)選定的記錄。當我執行我的代碼,我得到這個錯誤:當我嘗試更新訪問數據庫中的記錄時出現錯誤

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

在WHERE之前是否應該有一個逗號?你允許用戶更改客戶ID嗎?似乎你不想這樣做,或者如果是這樣的話,使用不同的主鍵。如果您簡化查詢以更新地址並跳過其餘部分,您是否仍然遇到相同的錯誤? – Tad

+0

將您的cmd.CommandText回顯到頁面或日誌文件,以便您可以看到您要執行的操作。 – Tad

+0

我只是做了這個地址,並去了這個錯誤: System.Data.OleDb.OleDbException未處理 消息=查詢表達式'5346 S. Eubank blvd WHERE [客戶ID] = 3'中的字符串中的語法錯誤。 源= Microsoft Access數據庫引擎 錯誤碼= -2147217900 堆棧跟蹤: 在 – Carson

回答

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; 
+0

工作正常!我看到你最後擺脫了多餘的報價,並放棄了客戶ID!優秀!謝謝! – Carson

+0

引用關於價值觀...並沒有意識到這是一個問題! – Carson

+0

您可能希望用任何這些值中的2個單引號搜索並替換單引號,否則您的SQL語句將再次中斷。 – Tad

0

我覺得你有的問題是WHERE之前的逗號。嘗試刪除並嘗試一下。

如果您可以捕獲您正在執行的確切的sql並嘗試在查詢瀏覽器中運行,它將更容易進行診斷。

此外,我建議您在構建sql時使用string.format。要獲得更好的解決方案,請嘗試LINQ to SQL或實體框架。

+0

那麼,我改變了它無濟於事......甚至在所有字符串周圍添加了單引號,並將所有的值放在括號內,這並沒有幫助......我會嘗試在瀏覽器中運行它,但這是好主意。 – Carson

0

你需要把周圍的值引號。這應該解決這裏的主要問題。

然而,這裏有一個非常巨大的安全漏洞。谷歌「SQL注入」,你會看到,一個壞人可以通過將惡意文本放入editIfTB文本框嚴重破壞你的一週。

+0

這只是一個個人項目,不會包含任何敏感數據。但是當我制定更多實質性的計劃時,我當然會接受你的建議。永遠不要少,我會研究它,謝謝! – Carson

0

除了安全漏洞之外,以這種方式構建查詢仍然存在穩定性問題。只要其中一個數據字段包含撇號,SQL就會再次中斷(例如,姓奧尼爾)。最佳做法是通過參數提供所有數據值;它避免了在所有這些單引號/撇號中連接的需要,不會對數據值敏感,並且不會有安全漏洞。

相關問題