MS Access 2016 DELETE查询报数据类型不匹配错误,求排查解决
解决Access DELETE查询数据类型不匹配问题
你的问题核心其实出在参数类型的自动推断上,和SQL语句里的括号、字段名写法无关(Access SQL允许字段名加括号,这不是报错原因)。虽然你用了Val()转换输入内容,但AddWithValue()有时候会错误地把转换后的数值当成字符串类型传递,和数据库里的数字类型InvoiceNo字段不匹配,这才导致了报错。
给你两个可行的解决方案:
方案一:明确指定参数数据类型
直接指定参数的OleDb类型,避免自动推断出错。根据你的InvoiceNo字段是数字类型(比如整型/长整型),修改代码如下:
sqlquery = "DELETE FROM tblProductTransDetail WHERE InvoiceNo = @inv" With sqlcommand .CommandText = sqlquery .Connection = FormMain.conn ' 这里根据字段实际类型选择:长整型用OleDbType.Long,整型用OleDbType.Integer .Parameters.Add("@inv", OleDbType.Integer).Value = Val(TextBoxNoNota.Text) .ExecuteNonQuery() End With
方案二:先验证输入有效性(更严谨)
先确保输入的是有效数字,避免Val()把空文本或非数字内容转成0(可能误删数据),同时明确参数类型:
Dim invoiceNum As Integer ' 尝试把输入转成整数,失败则提示用户 If Not Integer.TryParse(TextBoxNoNota.Text, invoiceNum) Then MsgBox("请输入有效的发票编号!") Exit Sub End If sqlquery = "DELETE FROM tblProductTransDetail WHERE InvoiceNo = @inv" With sqlcommand .CommandText = sqlquery .Connection = FormMain.conn .Parameters.Add("@inv", OleDbType.Integer).Value = invoiceNum .ExecuteNonQuery() End With
补充说明
AddWithValue()的自动类型推断并不靠谱,尤其是在处理Access数据库时,很容易因为类型匹配偏差抛出错误。明确指定参数类型后,就能彻底解决数据类型不匹配的问题。
内容的提问来源于stack exchange,提问作者Goofy_Phie
相关产品推荐
相关产品推荐

