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
相关产品推荐
相关产品推荐

