INSERT INTO 语句 Visual Basic 中的语法错误

Posted

技术标签:

【中文标题】INSERT INTO 语句 Visual Basic 中的语法错误【英文标题】:syntax error in INSERT INTO statement visual basic 【发布时间】:2014-03-03 16:25:50 【问题描述】:

我不知道这是否已得到解答,但我在插入语句中遇到语法错误问题。 这是我的代码,我使用的是 Visual Basic 2010,而我的数据库是 ms access 2010

Imports System.Data.OleDb
Imports Comprehensive.Form1
Public Class Form2
Dim cnn As New OleDb.OleDbConnection
Private Sub RefreshData()
    If Not cnn.State = ConnectionState.Open Then
        cnn.Open()
    End If
    Dim da As New OleDb.OleDbDataAdapter("SELECT * FROM items ORDER BY ID", cnn)
    Dim dt As New DataTable
    da.Fill(dt)
    Form1.DataGridView1.DataSource = dt
    cnn.Close()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim cmd As New OleDbCommand
    Try
        If Not cnn.State = ConnectionState.Open Then
            cnn.Open()
        End If


        cmd.Connection = cnn
        cmd.CommandText = "INSERT INTO Items (Item_Name, Item_Type, Date_Added)" + "'VALUES('" & TextBox1.Text  & "','" & TextBox2.Text & "','" & TextBox3.Text & "');'"
        cmd.ExecuteNonQuery()
        RefreshData()
    Catch ex As Exception
        MessageBox.Show(ex.Message & " - " & ex.Source)
        cnn.Close()
    End Try



End Sub

Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    'TODO: This line of code loads data into the 'ShitdataDataSet.Items' table. You can move, or remove it, as needed.
    Me.ItemsTableAdapter.Fill(Me.ShitdataDataSet.Items)
    cnn = New OleDb.OleDbConnection
    cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=shitdata.mdb;"
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    Me.Close()
End Sub

结束类

【问题讨论】:

主要SQL injection问题,VALUES之前和结尾;之后应该没有' VALUES 子句之前有一个额外的单引号,列列表中的右括号和 VALUES 关键字之间应该有一个空格,以及一个额外的单引号你的陈述结束。 Give me parameterized SQL, or give me death!!! 【参考方案1】:

INSERT 行包含在 VALUES 关键字之前不需要的单引号 AND 在 sql 语句的末尾,删除它们

 (Item_Name, Item_Type, Date_Added) VALUES(....) 
                                  ^^^          ^^^

但是像往常一样,你不会这样写sql命令。 您应该始终使用参数化查询 (SQL Injections)

    cmd.Connection = cnn
    cmd.CommandText = "INSERT INTO Items (Item_Name, Item_Type, Date_Added)" & _
                      "VALUES(?, ?, ?)"
    cmd.Parameters.AddWithValue("@p1", TextBox1.Text)
    cmd.Parameters.AddWithValue("@p2", TextBox2.Text)
    cmd.Parameters.AddWithValue("@p3", TextBox3.Text)
    cmd.ExecuteNonQuery()

最后,请记住,如果您的表中有 Date_Added 字段的日期时间(应该如此),那么您需要将 textbox3 值转换为日期时间。

如果是这种情况,那么,我建议查看this question,其中已解决在 access 数据库中插入日期时间值的问题。

【讨论】:

哇,回复太快了,谢谢大佬,解决了你的问题,我想我只需要担心程序上的更新和删除按钮 参数化查询?我第一次听说,我的教授没有讨论任何关于这个的事情,我想我需要做更多的研究,而不是听我老师的意见 当然,请查看Mr Isaksson 或我的评论中给出的链接,以更正式地讨论这个问题(确实是一个大问题) 还有解析文本的问题。当 TextBox1.Text 包含单引号时,连接的 sql 字符串会发生什么?试试看,然后给你的老师看:-) 得到一个错误“表达式预期”不知道我做对了

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

insert into 语句错误

MySQL中insert into语句的6种写法

access SQL语句中 insert into

用insert into 怎么添加多条记录

insert into语句的语法错误

insert into 语句出现错误,不知应该怎么将参数传入数据库?