2013-03-27 147 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