Access数据库项目出现System.Data.EvaluateException类型不匹配错误求助
解决Access数据库关联ComboBox与DataGridView时的类型不匹配错误
嘿,这个错误我太熟了!本质就是类型不匹配——你在做字段关联或者筛选的时候,把整数类型(System.Int32)和字符串类型(System.String)直接用=比较了,Access数据库可不会自动帮你转换类型,直接就抛出这个报错了。
结合你给出的场景(在form_inventory_Load里加载Sub_Category表,关联ComboBox和DataGridView),我给你拆解下问题和解决方案:
核心问题定位
你大概率是在以下某个环节犯了类型混淆的错误:
- 数据库里用来关联的字段是整数类型(比如分类ID),但ComboBox绑定的
ValueMember是字符串,或者你在筛选时把整数字段当成字符串来拼接查询; - 反过来,数据库字段是字符串,但你把ComboBox的选中值转成了整数去比较。
具体修复步骤
1. 先确认数据库字段类型
打开你的Access数据库,找到Sub_Category表,查看你用来关联的目标字段(比如Category_ID或Sub_Category_ID)的类型:
- 如果是数字(整型),那后续所有关联逻辑都要以整数类型来处理;
- 如果是文本,就统一用字符串类型处理。
2. 修正ComboBox的绑定逻辑
确保ComboBox的ValueMember和数据库字段类型完全匹配:
Private Sub form_inventory_Load(sender As Object, e As EventArgs) Handles MyBase.Load ' 加载Sub_Category表数据 Sub_CategoryTableAdapter.Fill(InventoryManager2DataSet.Sub_Category) ' 绑定ComboBox:DisplayMember是显示的文本,ValueMember是关联的数据库字段 ComboBox1.DataSource = InventoryManager2DataSet.Sub_Category ComboBox1.DisplayMember = "Sub_Category_Name" ' 示例:显示分类名称 ComboBox1.ValueMember = "Sub_Category_ID" ' 这个字段必须和数据库类型一致(比如Int32) End Sub
3. 修正DataGridView的筛选/关联逻辑
如果你是用RowFilter来根据ComboBox选中值过滤DataGridView数据,一定要注意类型匹配:
错误示例(触发报错):
' 错误:给Int类型字段加了单引号,把它当成字符串处理 DataGridView1.RowFilter = $"Sub_Category_ID = '{ComboBox1.SelectedValue}'"
正确写法:
' 先判断选中值不为空且是数字,再转成整数比较 If ComboBox1.SelectedValue IsNot Nothing AndAlso IsNumeric(ComboBox1.SelectedValue) Then DataGridView1.RowFilter = $"Sub_Category_ID = {CInt(ComboBox1.SelectedValue)}" End If
如果数据库字段是字符串类型,那就要加单引号(注意替换特殊字符避免语法错误):
DataGridView1.RowFilter = $"Sub_Category_Name = '{ComboBox1.SelectedValue.ToString().Replace("'", "''")}'"
4. 调试小技巧
要是还是不确定哪里出问题,可以加个断点,查看选中值的实际类型:
MessageBox.Show($"SelectedValue类型:{ComboBox1.SelectedValue.GetType().ToString()}")
把这个类型和数据库字段类型对比,就能快速找到不匹配的地方。
内容的提问来源于stack exchange,提问作者Michalodzien
相关产品推荐
相关产品推荐

