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

VB.NET操作Access触发Data type mismatch in criteria expression错误如何排查

报错原因排查

错误提示:Data type mismatch in criteria expression.(条件表达式中的数据类型不匹配)

该错误本质是SQL语句中传入的字段值和Access表中对应字段的定义类型不匹配,结合你提供的代码,可从以下几个方向定位问题:

  • 首先检查WHERE条件的Old_code字段类型匹配问题
    你代码中WHERE子句写的是WHERE Old_code=" & id & "",传入参数id为字符串类型:
    • 如果表中Old_code是文本类型,此处没有给id加单引号包裹,会被Access识别为数值类型,触发类型不匹配,应修改为WHERE Old_code='" & id & "'
    • 如果表中Old_code是数值类型,如果传入的id字符串包含非数字字符,也会触发类型错误,需要先校验id为合法数值再拼接SQL
  • 检查更新字段的类型匹配问题
    你代码中所有更新值都统一加了单引号作为字符串处理,如果表中以下字段为数值/货币类型,会直接触发类型错误:
    Sharecap(股本)、PrevSP(上期持股)、CurSP(当期持股)这类字段大概率定义为数值/货币类型,不应该用单引号包裹,需要去掉单引号,且提前校验对应输入框内容为合法数值
  • 检查日期字段Rec的格式问题
    Access的日期类型字段需要用#而不是单引号包裹,且你直接取DateTimePicker1.Text容易因为系统日期格式不一致出错,应该取DateTimePicker1.Value,对应SQL写法为Rec=#" & DateTimePicker1.Value.ToString("yyyy-MM-dd") & "#
  • 额外优化建议
    你当前直接拼接SQL的写法不仅容易触发类型匹配问题,还存在SQL注入风险,且遇到输入内容包含单引号时会直接语法报错,建议改用参数化查询写法,修正后示例如下:
Private Sub UpdateLV(ByVal id As String)
    If con.State <> ConnectionState.Open Then
        con.Open()
    End If
    ' 参数化SQL语句,OLEDB参数按位置匹配,参数顺序不能乱
    Dim SQL As String = "UPDATE tbl_sharePay SET Old_code=@Old_code,Chapa=@Chapa,Fname=@Fname,Lname=@Lname,Spgroup=@Spgroup,Sharecap=@Sharecap,PrevSP=@PrevSP,CurSP=@CurSP,Rec=@Rec,SpYear=@SpYear,Spstatus=@Spstatus WHERE Old_code=@WhereId"
    Using cmd As New OleDbCommand(SQL, con)
        cmd.Parameters.AddWithValue("@Old_code", ComboBox6.Text)
        cmd.Parameters.AddWithValue("@Chapa", TextBox2.Text)
        cmd.Parameters.AddWithValue("@Fname", TextBox3.Text)
        cmd.Parameters.AddWithValue("@Lname", TextBox4.Text)
        cmd.Parameters.AddWithValue("@Spgroup", TextBox6.Text)
        ' 数值类型字段如果允许为空,输入为空时可传DBNull.Value
        cmd.Parameters.AddWithValue("@Sharecap", Decimal.Parse(TextBox7.Text))
        cmd.Parameters.AddWithValue("@PrevSP", Decimal.Parse(TextBox8.Text))
        cmd.Parameters.AddWithValue("@CurSP", Decimal.Parse(TextBox9.Text))
        cmd.Parameters.AddWithValue("@Rec", DateTimePicker1.Value)
        cmd.Parameters.AddWithValue("@SpYear", TextBox11.Text)
        cmd.Parameters.AddWithValue("@Spstatus", ComboBox1.Text)
        cmd.Parameters.AddWithValue("@WhereId", id)
        
        If cmd.ExecuteNonQuery() > 0 Then
            cleartextboxes()
            MsgBox("Successfully Updated")
        End If
    End Using
    con.Close()
    Retrieve()
    If con.State <> ConnectionState.Closed Then
        con.Close()
    End If
End Sub

内容的提问来源于stack exchange,提问作者Ade

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 19:18:03