2013-03-27 144 views
0

我目前正在做一個簡單的項目,顯示一個人員列表,基本上表明他們是在辦公室還是在外面。人們還可以編輯列表來指示他們是否在辦公室或出門,並更新消息說明他們什麼時候回來。UPDATE語句中的VB.NET語法錯誤

我的問題是,當我更新列表時,我收到一個錯誤,說我的更新語句中有一個語法錯誤,但我找不到它。我正在使用visual studio 2012,在VB.NET中開發,並使用通過OleDB連接訪問的訪問數據庫。

這裏是問題

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    If InOutComboBox.SelectedItem = "IN" Then 
     MessageTextBox.Text = "" 
    End If 
    con = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\..\People.mdb") 
    con.Open() 
    If ListView1.SelectedIndices.Count > 0 Then 
     Dim comStr As String = "UPDATE tblStaffNames SET OutIn = '" & InOutComboBox.SelectedItem & "', Note = '" & MessageTextBox.Text & "' WHERE recid = " & ListView1.SelectedItems(0).SubItems(0).Text 
     cmd = New OleDbCommand(comStr, con) 
     Try 
      cmd.ExecuteNonQuery() 
     Catch ex As Exception 
      MessageBox.Show(ex.Message & " - " & ex.Source) 
     End Try 
    End If 
    ListView1.Clear() 
    LoadList() 

End Sub 

VB代碼這裏是comStr的採樣值,當我運行的代碼

UPDATE tblStaffNames SET OutIn = 'OUT', Note = 'on vacation' WHERE recid = 26 

任何幫助將非常感激。謝謝。

+1

什麼是確切的錯誤信息? – OldProgrammer 2013-03-27 16:45:02

+0

每次或僅有時會失敗嗎?當它失敗時,MessageTextBox.Text的值是什麼? – JSR 2013-03-27 16:48:17

+0

如果通過Access來完成同樣的SQL字符串,是否會出現錯誤? – 2013-03-27 16:48:37

回答

5

NOTE是Jet-MsAccess的保留關鍵字。
在將您的命令提交到數據庫引擎之前,您需要用方括號封裝

您的查詢中存在另一個大問題。用戶輸入不能被信任使用字符串連接直接發送到數據庫。您應該使用參數化查詢(Sql Injection

Using con = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\..\People.mdb") 
    con.Open() 
    If ListView1.SelectedIndices.Count > 0 Then 
     Dim comStr As String = "UPDATE tblStaffNames SET OutIn = ?, [Note] = ?" & _ 
       " WHERE recid = ?" 
     cmd = New OleDbCommand(comStr, con) 
     cmd.Parameters.AddWithValue("@p1", InOutComboBox.SelectedItem) 
     cmd.Parameters.AddWithValue("@p2", MessageTextBox.Text) 
     cmd.Parameters.AddWithValue("@p3", ListView1.SelectedItems(0).SubItems(0).Text) 
     Try 
      cmd.ExecuteNonQuery() 
     Catch ex As Exception 
      MessageBox.Show(ex.Message & " - " & ex.Source) 
     End Try 
    End If 
End Using 

,請注意參數的順序,在OleDb的是位置,所以每一個參數應該出現的參數集合在由?佔位符預期的確切順序。另外,如您所見,我還添加了使用語句,以確保在完成對它的處理後正確關閉和處理連接對象。

+0

謝謝它現在可以工作。這是我得到的1.不知道的,和2使用別人的數據庫 – mlieven 2013-03-27 16:58:03

+1

謝謝,我認爲注意但是一個保留字,但沒有使用Access是一個很長的時間,所以不知道如何逃脫它。 – Sparky 2013-03-27 16:59:43

+0

並感謝您的額外tid-bit – mlieven 2013-03-27 17:02:28