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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 07:47:28