You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:20:14