按ID删除记录

时间:2019-04-09 10:02:55

标签: vb.net ms-access

我正在尝试通过ID删除数据库中的一条记录,但显示为

  

“条件表达式中的数据类型不匹配。”

你为什么这么认为?

Private Sub testdelete()
        'THIS SAVES TO THE DEBUG ACCESS DATABASE!!!!!
        Dim conn As New OleDbConnection
        conn = New OleDbConnection
        dbprovider = "Provider=Microsoft.ACE.OLEDB.12.0;"
        Dim databasePath = "Data Source = FULL YUGIOH ACCESS DATABASE.accdb;"
        conn.ConnectionString = dbprovider & databasePath
        Dim Stringc As String = "delete from cmon11 where ID='" & TextBox2.Text & "'"
        Dim command As OleDbCommand = New OleDbCommand(Stringc, conn)


        Try
            conn.Open()
            command.ExecuteNonQuery()
            command.Dispose()
            conn.Close()

        Catch ex As Exception
            MsgBox(ex.Message)

        Finally
            conn.Dispose()

        End Try
    End Sub

2 个答案:

答案 0 :(得分:0)

如注释中所述,数据类型不匹配是因为SQL语句中的where子句试图将字段ID(您声明为整数)的值与字符串值。

串联后,SQL代码可能如下所示:

delete from cmon11 where ID='123'

在这里,'123'是一个字符串,而不是整数-要提供一个整数值,您将删除单引号以产生:

delete from cmon11 where ID=123

但是,当使用允许任意文本输入的文本框保存的值构造SQL语句时,这不能解决潜在的SQL注入问题。

修改代码以删除单引号后,请考虑用户在文本框中键入以下内容的含义:

;drop table cmon11;--

解决方案是使用参数使查询在这种情况下将失败,而不是执行不需要的操作。 Erik的This answer是出色的参考书,详细介绍了在MS Access中参数化查询的各种方法。

答案 1 :(得分:0)

Using...End Using确保即使发生错误也可以关闭并处置数据库对象。

始终使用参数来最大程度地减少类型不匹配并防止Sql Injection。我在Integer上猜到了Id字段的数据类型,但是您必须检查数据库中的实际数据类型。

Private Sub testdelete()
    Using conn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source = FULL YUGIOH ACCESS DATABASE.accdb;")
        Using command As New OleDbCommand("Delete From cmon11 Where ID= @ID;", conn)
            command.Parameters.Add("@ID", OleDbType.Integer).Value = CInt(TextBox2.Text)
            conn.Open()
            command.ExecuteNonQuery()
        End Using
    End Using
End Sub