2013-10-13 69 views
2

是否有人可以解释为什么,当我点击“提交”按钮,我得到的错误OleDbCommandBuilder创建导致“语法错误”的SQL语句

在INSERT的语法错误的语句。

这是代码。

Public Class Form3 
    Dim inc As Integer 
    Dim MaxRows As Integer 
    Dim con As New OleDb.OleDbConnection 
    Dim ds As New DataSet 
    Dim da As OleDb.OleDbDataAdapter 

    Dim sql As String 

    Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = D:\TA_Officers.mdb" 
     con.Open() 
     sql = "SELECT * from TA_OFFICER" 
     da = New OleDb.OleDbDataAdapter(sql, con) 
     da.Fill(ds, "TA_Officers") 
     con.Close() 

     MaxRows = ds.Tables("TA_Officers").Rows.Count 
     inc = -1 
    End Sub 

    Private Sub NavigateRecords() 
     txtFName.Text = ds.Tables("TA_Officers").Rows(inc).Item(1) 
     txtMInitial.Text = ds.Tables("TA_Officers").Rows(inc).Item(2) 
     txtLName.Text = ds.Tables("TA_Officers").Rows(inc).Item(3) 
     txtContact.Text = ds.Tables("TA_Officers").Rows(inc).Item(4) 
     txtEmail.Text = ds.Tables("TA_Officers").Rows(inc).Item(5) 
     txtPosition.Text = ds.Tables("TA_Officers").Rows(inc).Item(6) 
     txtCourse.Text = ds.Tables("TA_Officers").Rows(inc).Item(7) 
     txtAddress.Text = ds.Tables("TA_Officers").Rows(inc).Item(8) 
    End Sub 

    Private Sub BtnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAdd.Click 
     BtnCommit.Enabled = True 
     BtnAdd.Enabled = False 
     BtnUpdate.Enabled = False 
     BtnDel.Enabled = False 

     txtPosition.Clear() 
     txtLName.Clear() 
     txtFName.Clear() 
     txtMInitial.Clear() 
     txtAddress.Clear() 
     txtCourse.Clear() 
     txtEmail.Clear() 
     txtContact.Clear() 
    End Sub 

    Private Sub RdMember_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles RdMember.CheckedChanged 
     Label2.Visible = False 
     txtPosition.Visible = False 
    End Sub 

    Private Sub RdOfficer_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles RdOfficer.CheckedChanged 
     Label2.Visible = True 
     txtPosition.Visible = True 
    End Sub 

    Private Sub BtnUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnUpdate.Click 
     Dim cb As New OleDb.OleDbCommandBuilder(da) 

     ds.Tables("TA_Officers").Rows(inc).Item(1) = txtFName.Text 
     ds.Tables("TA_Officers").Rows(inc).Item(2) = txtMInitial.Text 
     ds.Tables("TA_Officers").Rows(inc).Item(3) = txtLName.Text 
     ds.Tables("TA_Officers").Rows(inc).Item(4) = txtContact.Text 
     ds.Tables("TA_Officers").Rows(inc).Item(5) = txtEmail.Text 
     ds.Tables("TA_Officers").Rows(inc).Item(6) = txtPosition.Text 
     ds.Tables("TA_Officers").Rows(inc).Item(7) = txtCourse.Text 
     ds.Tables("TA_Officers").Rows(inc).Item(8) = txtAddress.Text 

     da.Update(ds, "TA_Officers") 

     MsgBox("Data Updated!") 
    End Sub 

    Private Sub BtnDel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnDel.Click 
     Dim cb As New OleDb.OleDbCommandBuilder(da) 

     ds.Tables("TA_Officers").Rows(inc).Delete() 
     MaxRows = MaxRows - 1 

     inc = 0 
     NavigateRecords() 
     da.Update(ds, "TA_Officers") 
    End Sub 

    Private Sub BtnClear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnClear.Click 
     BtnCommit.Enabled = False 
     BtnAdd.Enabled = True 
     BtnUpdate.Enabled = True 
     BtnDel.Enabled = True 

     inc = 0 
     NavigateRecords() 
    End Sub 

    Private Sub BtnCommit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnCommit.Click 
     If inc <> -1 Then 

      Dim cb As New OleDb.OleDbCommandBuilder(da) 
      Dim dsNewRow As DataRow 

      dsNewRow = ds.Tables("TA_Officers").NewRow() 

      dsNewRow.Item("Firstname") = txtFName.Text 
      dsNewRow.Item("Middleinitial") = txtMInitial.Text 
      dsNewRow.Item("Lastname") = txtLName.Text 
      dsNewRow.Item("Mobilenumber") = txtContact.Text 
      dsNewRow.Item("Emailaddress") = txtEmail.Text 
      dsNewRow.Item("Position") = TxtPosition.Text 
      dsNewRow.Item("Course") = txtCourse.Text 
      dsNewRow.Item("Address") = txtAddress.Text 

      ds.Tables("TA_Officers").Rows.Add(dsNewRow) 
      **da.Update(ds, "TA_Officers")** 

      MsgBox("New Record added to the Database") 
      BtnCommit.Enabled = False 
      BtnAdd.Enabled = True 
      BtnUpdate.Enabled = True 
      BtnDel.Enabled = True 
     End If 
    End Sub 

    Private Sub BtnBack_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnBack.Click 
     Form2.Show() 
     Me.Close() 
    End Sub 

    Private Sub TA_MEMBERSBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 
     Me.Validate() 
     Me.TA_MEMBERSBindingSource.EndEdit() 
     Me.TableAdapterManager.UpdateAll(Me.TA_OfficersDataSet) 

    End Sub 
End Class 

回答

0

当代码和数据库中的数据类型不同时,可能会发生这种错误。 检查日志可以提供一些这方面的信息。

2

Position是JET 4.0的保留字 - 尝试重命名其他字段,如prog_position。访问通常会让您创建一个保留名称的列,但是当您使用代码访问它时,JET会对其进行阻止,并为您提供一个通用的Syntax error in INSERT INTO Statement错误,而不是特定的错误。查看http://support.microsoft.com/kb/248738以获取有关保留字的更多信息。商品实践总是在列名前添加一些短名称,以避免出现冲突或保留字问题。

2

正如Makita提到的,您的问题源自于事实Position是Jet/ACE SQL中的保留字。解决的办法是下面的代码两行创建OleDbCommandBuilder对象之后添加:

cb.QuotePrefix = "[" 
cb.QuoteSuffix = "]" 

这将告诉OleDbCommandBuilder产生这样

INSERT INTO [TA_OFFICER] ([FirstName], ... 

SQL语句,而不是

...
INSERT INTO TA_OFFICER (FirstName, ... 

在这些方括号中包含Position列名称会告诉Jet数据库引擎它是列名称,不是关键字。

+0

我明白这里的概念。但是,你究竟如何实现你所建议的代码呢? – gromit1

+1

@ gromit1就像我说过的,你只需添加两行VB.NET代码来设置你创建的OleDbCommandBuilder对象的属性(在这种情况下,通过“Dim cb As New OleDb.OleDbCommandBuilder(da) )。 –

+0

完美。感谢您为我拼写出来。 – gromit1