我正在尝试通过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
答案 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