【问题标题】:Syntax error in INSERT INTO statement (vb.net)INSERT INTO 语句中的语法错误 (vb.net)
【发布时间】:2015-02-15 13:12:23
【问题描述】:

当我在 vb 中运行我的项目时收到一个错误:[insert into statement 中的语法错误]

Private Sub Bsimpan_Click(sender As Object, e As EventArgs) Handles Bsimpan.Click
    If Tno.Text = "" Or Tnis.Text = "" Or Tnama.Text = "" Or Tkelas.Text = "" Or CBjk.Text = "" Or Tt4lahir.Text = "" Or ttgllahir.Text = "" Then
        MsgBox("Data Belum Lengkap")
        Exit Sub
    Else
        Call koneksi()
        cmd = New OleDbCommand("select * from Anggota where nis='" & Tnis.Text & "'", conn)
        rd = cmd.ExecuteReader
        rd.Read()
        If Not rd.HasRows Then
            Dim sqltambah As String = "insert into Anggota(No,nis,Nama,Kelas,Jenis_kelamin,Tempat_lahir,Tanggal_lahir) values " & _
                "('" & Tno.Text & "', '" & Tnis.Text & "', '" & Tnama.Text & "', '" & Tkelas.Text & "', '" & CBjk.Text & "', '" & Tt4lahir.Text & "', '" & ttgllahir.Text & "')"
            cmd = New OleDbCommand(sqltambah, conn)
            cmd.ExecuteNonQuery()
            Call kosongkan()
            Call tampilkan()
            Tno.Focus()
        Else
            Dim sqledit As String = "update Anggota set " & _
                "NIS='" & Tnis.Text & "', " & _
                "Nama='" & Tnama.Text & "', " & _
                "Kelas='" & Tkelas.Text & "', " & _
                "Jenis_kelamin='" & CBjk.Text & "', " & _
                "Tempat_lahir='" & Tt4lahir.Text & "', " & _
                "Tanggal_lahir='" & ttgllahir.Text & "'"
            cmd = New OleDbCommand(sqledit, conn)
            cmd.ExecuteNonQuery()
            Call kosongkan()
            Call tampilkan()
        End If
    End If
End Sub

【问题讨论】:

  • 除了 SQL 注入风险外,通过连接构建查询字符串总是会导致语法错误。改用参数化查询。
  • 能否提供连接后sqltambah的值?

标签: sql vb.net


【解决方案1】:

可能是表名和第一个括号之间缺少空格吗?

找出问题的最佳方法可能是复制sqltambah 变量的内容并自己运行插入语句,看看是否能获得更多关于错误位置的信息。

看看这个:http://msdn.microsoft.com/en-us/library/ms174335.aspx

【讨论】:

  • 缺少空格不是语法错误,没问题
【解决方案2】:

使用参数化查询。

例如,查询如下所示:

INSERT INTO anggota 
            (no, 
             nis, 
             nama, 
             kelas, 
             jenis_kelamin, 
             tempat_lahir, 
             tanggal_lahir) 
VALUES      (@no, 
             @nis, 
             @nama, 
             @kelas, 
             @jenis_kelamin, 
             @tempat_lahir, 
             @tanggal_lahir) 

然后调整你的代码:

cmd.Parameters.AddWithValue("@No", Tno.Text)
cmd.Parameters.AddWithValue("@nis", Tnis.Text)
cmd.Parameters.AddWithValue("@Nama", Tnama.Text)
cmd.Parameters.AddWithValue("@Kelas", Tkelas.Text)
cmd.Parameters.AddWithValue("@Jenis_kelamin", CBjk.Text)
cmd.Parameters.AddWithValue("@Tempat_lahir", Tt4lahir.Text)
cmd.Parameters.AddWithValue("@Tanggal_lahir", ttgllahir.Text)


cmd = New OleDbCommand(sqltambah, conn)
cmd.ExecuteNonQuery()

【讨论】:

  • 不,nis、Nama、Kelas、Jenis_kelamin、Tempat_lahir、Tanggal_lahir 这些是插入查询中的 7 列
  • @meda 我在哪里写代码 cmd... 在值中?
【解决方案3】:

它可能是您的值中的一个字符,它可能会创建一个无效的 sql 语句。然而,生成一条包含用户输入连接的 sql 语句是一件非常危险和邪恶的事情,因为它为一个简单、众所周知且有据可查的安全问题打开了大门,称为 SQL 注入。

处理参数的唯一好方法是使用参数化 SQL 查询。

查看SO question了解更多详情。

【讨论】:

    猜你喜欢
    • 2013-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多