执行 INSERT INTO 语句时出现语法错误

Posted

技术标签:

【中文标题】执行 INSERT INTO 语句时出现语法错误【英文标题】:Syntax error when executing INSERT INTO statement 【发布时间】:2013-12-03 16:08:16 【问题描述】:

我输入了正确的dataSource,但我无法解决问题cmd.ExecuteNonQuery() 说:

INSERT INTO 语句中的语法错误。

代码:

Private Sub btnadd1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnadd1.Click
    Dim cmd As New OleDb.OleDbCommand
    Dim Printlist1 As New DataTable
    If Not con.State = ConnectionState.Open Then
        con.ConnectionString = "Provider=Microsoft.Ace.OLEDB.12.0; Data Source=c:Database11.accdb"
        con.Open()
        cmd.Connection = con
    End If
    If Me.text1.Tag & "" = "" Then
        cmd.CommandText = "INSERT INTO Printlist1(StickerCode, Description, Company, Department, Location, User, SerialNumber, DatePurchased, Tagable, Quantity, Brand, Model)" & _
                            " VALUES(" & Me.text1.Text & ",'" & Me.text2.Text & "','" & _
                                Me.text3.Text & "','" & Me.text4.Text & "','" & Me.text5.Text & "','" & _
                                Me.text6.Text & "','" & Me.text7.Text & "','" & Me.text8.Text & "','" & _
                                Me.text9.Text & "','" & Me.text10.Text & "','" & Me.text11.Text & "','" & _
                                Me.text12.Text & "')"
        cmd = New OleDbCommand(cmd.CommandText, con)
        cmd.ExecuteNonQuery()
    Else
        cmd.CommandText = "UPDATE Printlist1 " & _
                        " SET StickerCode='" & Me.text1.Text & _
                        ", Description='" & Me.text2.Text & "'" & _
                        ", Company='" & Me.text3.Text & "'" & _
                        ", Department='" & Me.text4.Text & "'" & _
                        ", Location='" & Me.text5.Text & "'" & _
                        ", User='" & Me.text6.Text & "'" & _
                        ", SerialNumber='" & Me.text7.Text & "'" & _
                        ", DatePurchased='" & Me.text8.Text & "'" & _
                        ", Tagable='" & Me.text9.Text & "'" & _
                        ", Quantity='" & Me.text10.Text & "'" & _
                        ", Brand='" & Me.text11.Text & "'" & _
                        ", Model='" & Me.text12.Text & "'" & _
                        " WHERE text1=" & Me.text1.Tag
        cmd.ExecuteNonQuery()
    End If
    RefreshData()
    Me.btnclear1.PerformClick()
    con.Close()
End Sub

【问题讨论】:

请学会使用参数。 当您跟踪代码时,cmd.CommandText 属性在将其提供给OleDbCommand 之前的值是多少?另外,正如昨天有人提到的,你真的应该使用参数。 我真的不认为您必须使用SQL插入数据表,您只需使用vb net code即可 这些文本框是否包含撇号? 【参考方案1】:

使用参数化查询,如下所示:

cmd.CommandText = "INSERT INTO Printlist1(StickerCode, Description, Company, Department, Location, User, SerialNumber, DatePurchased, Tagable, Quantity, Brand, Model)" & _
                        " VALUES(@StickerCode, @Description, @Company, @Department, @Location, @User, @SerialNumber, @DatePurchased, @Tagable, @Quantity, @Brand, @Model)"

cmd.Parameters.AddWithValue("@StickerCode", Me.Text1.Text)
cmd.Parameters.AddWithValue("@Description", Me.Text2.Text)
cmd.Parameters.AddWithValue("@Company", Me.Text3.Text)
cmd.Parameters.AddWithValue("@Department", Me.Text4.Text)
cmd.Parameters.AddWithValue("@Location", Me.Text5.Text)
cmd.Parameters.AddWithValue("@User", Me.Text6.Text)
cmd.Parameters.AddWithValue("@SerialNumber", Me.Text7.Text)
cmd.Parameters.AddWithValue("@DatePurchased", Me.Text8.Text)
cmd.Parameters.AddWithValue("@Tagable", Me.Text9.Text)
cmd.Parameters.AddWithValue("@Quantity", Me.Text10.Text)
cmd.Parameters.AddWithValue("@Brand", Me.Text11.Text)
cmd.Parameters.AddWithValue("@Model", Me.Text12.Text)

注意:最好保持参数的顺序与查询一致,因为如果顺序改变,Microsoft Access 等数据库将无法正确执行查询。

【讨论】:

我会尝试并尝试理解参数化查询..谢谢。【参考方案2】:

您的某个Me.textN.Text 值中可能包含撇号或其他一些意外字符,这些字符破坏了您的SQL 引号。解决这个问题的方法是使用参数化查询和/或存储过程。

顺便说一句,这也将保护您免受 SQL 注入攻击,该攻击利用了在客户端应用程序中将 SQL 命令组合为字符串时的相同缺点。

(注意:我假设 Me.text1.Text 是一个数字,因为 StickerCode 是一个数字。否则这就是问题,因为您没有像其他列那样引用它。)

【讨论】:

【参考方案3】:

第一行缺少 '

...
"SET StickerCode='" & Me.text1.Text & "'" & _ 
...

【讨论】:

但这是更新命令中的错误,而不是插入命令。 @StevenDoggart 或两者兼而有之。如果 StickerCode 是一个文本字段,那么 INSERT 语句中的引号也会丢失。【参考方案4】:

您的第一个值周围缺少单引号。试试

" VALUES('" & Me.text1.Text & "','" & Me.text2.Text & "','" & _
    Me.text3.Text & "','" & Me.text4.Text & "','" & Me.text5.Text & "','" & _
    Me.text6.Text & "','" & Me.text7.Text & "','" & Me.text8.Text & "','" & _
    Me.text9.Text & "','" & Me.text10.Text & "','" & Me.text11.Text & "','" & _
    Me.text12.Text & "')"

【讨论】:

这不取决于数据类型吗? 是的,它确实取决于列的数据类型。根据变量名 text1,我假设该列是字符串类型。

以上是关于执行 INSERT INTO 语句时出现语法错误的主要内容,如果未能解决你的问题,请参考以下文章

将记录添加到 Access 数据库时出现“INSERT INTO 语句中的语法错误”

当我尝试通过 C# 将日期插入 Access 数据库时出现“INSERT INTO 语句中的语法错误”错误

使用 INSERT INTO 时出现 MySQL 错误 2002

Insert Into 语句的语法错误

“INSERT INTO 语句中的语法错误”错误 - 错误是啥?

为啥当我使用柴油 insert_into 数据到数据库时出现“找不到名为 `execute` 的方法”错误?