OleDb查询触发Data type mismatch in criteria expression错误的排查求助
OleDb查询触发Data type mismatch in criteria expression错误的排查求助
我现在尝试根据ID进行查询,但一直遇到错误,想知道自己哪里做错了或者该怎么修复。
我的代码如下:
Using conn As New OleDbConnection(My.Settings.marcasConnectionString) Dim cmd1 As New OleDbCommand("Select * from QATracker where ID='" & intNewPK & "'", conn) cmd1.Parameters.AddWithValue("ID", TextBox2.Text) Dim da As New OleDbDataAdapter da.SelectCommand = cmd1 Dim QATracker As New DataTable QATracker.Clear() da.Fill(QATracker) DataGridView1.DataSource = QATracker End Using
错误发生在da.fill(QATracker)这一行,具体错误信息是:
System.Data.OleDb.OleDbException HResult=0x80040E07 Message=Data type mismatch in criteria expression.
问题排查与修复思路
你代码里的两个明显问题导致了这个类型不匹配错误:
- SQL拼接错误+类型不兼容:你把
intNewPK(看起来是整数类型)用单引号括起来当成字符串传入SQL语句,但如果数据库里的ID字段是数值类型(比如int),这种写法会让数据库把数值型的ID和字符串做对比,直接触发类型不匹配。 - 参数化查询用错了:你写的SQL语句里根本没用到参数占位符,而是直接拼接了变量,后面添加的
cmd1.Parameters.AddWithValue("ID", TextBox2.Text)完全是无效操作,既没起到参数化的作用,还混淆了查询逻辑。
修正后的代码
下面是调整后的正确写法,既解决了类型问题,又规范了参数化查询:
Using conn As New OleDbConnection(My.Settings.marcasConnectionString) ' OleDb用?作为参数占位符,注意参数是按顺序匹配的,不是按名称 Dim cmd1 As New OleDbCommand("Select * from QATracker where ID = ?", conn) ' 先把输入的文本转成整数,避免类型错误 Dim targetId As Integer If Integer.TryParse(TextBox2.Text, targetId) Then ' 指定参数类型,比AddWithValue更安全,避免隐式类型转换问题 cmd1.Parameters.Add(New OleDbParameter("ID", OleDbType.Integer)).Value = targetId Else ' 处理用户输入无效的情况 MessageBox.Show("请输入有效的ID数值") Return End If Dim da As New OleDbDataAdapter(cmd1) Dim QATracker As New DataTable ' 新建的DataTable不需要Clear(),直接填充即可 da.Fill(QATracker) DataGridView1.DataSource = QATracker End Using
额外提醒
- OleDb不支持命名参数,参数是按照你添加的顺序和SQL里的
?一一对应的,所以别搞混顺序。 - 永远不要直接拼接SQL字符串,除了类型问题,还会有SQL注入的安全风险。
- 用
Integer.TryParse处理用户输入,能避免输入非数值时的崩溃,让程序更健壮。
备注:内容来源于stack exchange,提问作者Juan Arias
相关产品推荐
相关产品推荐

