插入到访问和vb.net上的语句中的语法错误

时间:2018-01-30 06:46:18

标签: vb.net ms-access-2010

我有一个错误,但我不知道是什么部分,但我检查我的表,但它是确切的列我使用ms access2010作为数据库,每次我添加一个新的记录theres一个msgbox显示(插入语句中的语法错误)继承我的代码:

Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)


End Sub

Private Sub GroupBox1_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GroupBox1.Enter

End Sub

Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim add As String = "insert into setplan(ma,planqty,side,start,end,total,remarks) values ('" & cmbshift.SelectedItem & "','" & txtplqty.Value & "','" & cmbside.SelectedItem & "','" & timestart.Text & "','" & timeend.Text & "','" & txttotal.Text & "','" & txtrem.Text & "')"

    Dim connection As String = "Provider=Microsoft.Ace.Oledb.12.0; Data Source=C:\Users\Administrator\Documents\plan.mdb; Persist Security Info=False;"
    Using conn As New OleDb.OleDbConnection(connection)
        Try

            conn.Open()
            If cmbshift.SelectedItem = "" Then
                MsgBox("Please Select Shift Schedule")
            ElseIf txtplqty.Value = 0 Then
                MsgBox("Please Input Plan Quantity")
            ElseIf cmbside.SelectedItem = "" Then
                MsgBox("Please select Side")
            ElseIf timestart.Text = "" Then
                MsgBox("Please Select A Start Time")
            ElseIf timeend.Text = "" Then
                MsgBox("Please Select A Start Time")
            ElseIf timeend.Text = timestart.Text Then
                MsgBox("Time end must not be equal to Time Start")
            Else
                MsgBox(add)
                Dim cmd As New OleDb.OleDbCommand(add, conn)
                cmd.ExecuteNonQuery()

                MsgBox("New Schedule Added")

            End If
            conn.Close()
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Using



End Sub

Private Sub timestart_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timestart.ValueChanged

End Sub

结束班

2 个答案:

答案 0 :(得分:1)

startend字对于sql是唯一的,因此这些关键字可能会导致问题。尝试将这些列名称切换为startTimeendTime,并检查是否有效。

答案 1 :(得分:0)

正如评论中所述,如果你要将其作为参数化查询而不是将字符串连接成显式SQL命令,那会好得多。尽管如此,使用您的示例,有一些事情可能导致您描述的错误,其中一些已在评论中提及(以及 Atilla 的答案)。 / p>

  1. StartEnd是SQL中的保留关键字。将它们用作列名称可能会导致在从.NET应用程序通过OleDb对这些列执行查询时出现意外行为。基本上有两种解决方法:

    • 重命名数据库中的这些列 - Atilla 建议StartTimeEndTime,这可能效果很好。
    • 如果重命名列不是一个选项(这些列由您使用的其他系统/进程使用),最好的办法是修改查询。由于您似乎正在使用Access数据库(.mdb)文件,因此您可以将查询中的列名称括在方括号中(例如[Start][End]
  2. 在使用Access数据库时,我实际上已经采用这种方式封闭所有我的表和列名称,因为我们有一些列名包含空格等的数据库,所以这有很大帮助。

    1. 您还需要考虑您尝试INSERT数据的列的实际数据类型。同样,由于您似乎正在使用Access数据库文件,因此需要查看几个语法事项。
      • 插入Date/Time字段的值应使用#字符而不是'字符包装。
      • 数字字段类型(例如,NumberCurrency不应包含'字符(或任何其他字符,就此而言)
      • 如果您打算在文本字段中插入的字符串值(例如Short TextLong Text)包含任何数量的" special/invalid characters"包括单引号和/或双引号,这些都需要清理干净"在执行查询之前。如果是这种情况(或者可能可能),您可以创建一个方法来在SQL命令中使用之前清除字符串值。 请参阅此帖子底部的示例,其中大部分(如果不是全部)可能无效的字符只是从字符串值中删除
    2. 请注意,出于本答案的目的,我使用了MS Access UI中的数据类型名称而不是实际的OleDb / Odbc数据类型来尝试简化操作

      在不知道数据库表中使用的实际数据类型或来自表单控件的值的情况下,我只能做出假设,但是,如果我 绝对必须 使用这种类型的查询构建(意思是,由于某些原因它不可能使其参数化),我可能会创建查询以查找更像这样的内容:

      Dim add As String = "INSERT INTO setplan " & _
          "([ma], [planqty], [side], [start], [end], [total], [remarks]) " & _
          "VALUES ('" & cmbshift.SelectedItem & "', " & _
          txtplqty.Value & ", " & _
          "'" & cmbside.SelectedItem & "', " & _
          "#" & timestart.Text & "#, " & _
          "#" & timeend.Text & "#, " & _
          txttotal.Text & ", " & _
          "'" & txtrem.Text & "')"
      

      这假定[start][end]列为Date/Time列,[planqty][total]列为Number的某种类型列(整数,单一等)。

      HOWEVER:如上所述,最好将其作为参数化查询。查看此SO问题的已接受答案,了解有关如何执行此操作的详细信息: VB.Net - Inserting data to Access Database using OleDb

      连接SQL命令时String值的清理函数示例:

      Friend Function CleanStringForSQL(ByVal DirtyString As String) As String
          Dim CleanString As String = DirtyString.Replace("'", "")
      
          CleanString = CleanString.Replace("""", "")
          CleanString = CleanString.Replace("*", "")
          CleanString = CleanString.Replace("\", "")
          CleanString = CleanString.Replace("/", "")
          CleanString = CleanString.Replace(";", "")
          CleanString = CleanString.Replace("%", "")
          CleanString = CleanString.Replace("#", "")
          CleanString = CleanString.Replace("(", "")
          CleanString = CleanString.Replace(")", "")
          CleanString = CleanString.Replace("[", "")
          CleanString = CleanString.Replace("]", "")
      
          Return CleanString
      End Function
      

      然后可以在SQL命令字符串的声明语句中使用它,如:

      ...
      "VALUES ('" & CleanStringForSQL(cmbshift.SelectedItem) & "', " & _
      ...