2013-10-13 71 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