Visual Studio 2022 VB.NET中Access按ID查询数据类型不匹配问题求助
Access自动编号ID查询时数据类型不匹配问题解决
问题现象
使用VB.NET(Visual Studio 2022)查询Access数据库时,按名称查询正常,但按自动编号类型的主键ID查询时抛出错误:
System.Data.OleDb.OleDbException: data type mismatch in criteria expression
原查询代码如下:
Dim consulta As String Dim oda As New OleDbDataAdapter Dim ods As DataSet Dim registro As Byte If ComboBox2.Text <> " " Then consulta = "select *from QAtracker where ID='" & TextBox55.Text & " '" oda = New OleDbDataAdapter(consulta, Conexion1) ods = New DataSet oda.Fill(ods, "QAtracker") registro = ods.Tables("QAtracker").Rows.Count If registro <> 0 Then DataGridView1.DataSource = ods DataGridView1.DataMember = "QAtracker" TextBox55.Text = ods.Tables("QAtracker").Rows(0).Item("ID") TextBox5.Text = ods.Tables("QAtracker").Rows(0).Item("Login") TextBox6.Text = ods.Tables("QAtracker").Rows(0).Item("Logout") Else MsgBox("Codigo no existe") Conexion1.Close() End If End If
问题原因
Access的自动编号类型(AutoNumber)属于数值类型,但你的查询语句中给ID值加了单引号,将其当作字符串类型处理,导致数据库在匹配条件时出现数据类型不匹配的错误。
同时代码还有两处细节问题:
select *from缺少空格,正确写法是select * from- 拼接的ID值末尾多了一个空格(
" '"中的空格),可能导致数值格式无效
修正方案
方案一:直接修正字符串拼接
去掉ID值两侧的单引号,同时修正SQL语句的空格问题:
Dim consulta As String Dim oda As New OleDbDataAdapter Dim ods As DataSet Dim registro As Byte If ComboBox2.Text <> " " Then ' 去掉ID的单引号,修正*和from之间的空格,移除末尾多余空格 consulta = "select * from QAtracker where ID=" & TextBox55.Text oda = New OleDbDataAdapter(consulta, Conexion1) ods = New DataSet oda.Fill(ods, "QAtracker") registro = ods.Tables("QAtracker").Rows.Count If registro <> 0 Then DataGridView1.DataSource = ods DataGridView1.DataMember = "QAtracker" TextBox55.Text = ods.Tables("QAtracker").Rows(0).Item("ID").ToString() TextBox5.Text = ods.Tables("QAtracker").Rows(0).Item("Login").ToString() TextBox6.Text = ods.Tables("QAtracker").Rows(0).Item("Logout").ToString() Else MsgBox("Codigo no existe") Conexion1.Close() End If End If
方案二:使用参数化查询(推荐)
参数化查询能彻底避免SQL注入风险,同时自动处理数据类型匹配,是更规范的写法:
Dim consulta As String Dim oda As OleDbDataAdapter Dim ods As DataSet Dim registro As Byte Dim idValue As Integer If ComboBox2.Text <> " " Then ' 先验证输入是否为有效整数 If Not Integer.TryParse(TextBox55.Text, idValue) Then MsgBox("请输入有效的ID数值") Return End If consulta = "select * from QAtracker where ID=?" ' Access使用?作为参数占位符 oda = New OleDbDataAdapter(consulta, Conexion1) ' 添加参数并指定数据类型,确保类型匹配 oda.SelectCommand.Parameters.Add("@ID", OleDbType.Integer).Value = idValue ods = New DataSet oda.Fill(ods, "QAtracker") registro = ods.Tables("QAtracker").Rows.Count If registro <> 0 Then DataGridView1.DataSource = ods DataGridView1.DataMember = "QAtracker" TextBox55.Text = ods.Tables("QAtracker").Rows(0).Item("ID").ToString() TextBox5.Text = ods.Tables("QAtracker").Rows(0).Item("Login").ToString() TextBox6.Text = ods.Tables("QAtracker").Rows(0).Item("Logout").ToString() Else MsgBox("Codigo no existe") Conexion1.Close() End If End If
内容的提问来源于stack exchange,提问作者Juan Arias
相关产品推荐
相关产品推荐

