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

VB.NET向MS Access插入数据时遇「Data type mismatch」错误求助

解决VB.NET插入Access数据库的「Data type mismatch in criteria expression」错误

核心问题分析

  • 参数占位符遗漏:原INSERT语句中emp_basic未加@前缀,Access会将其解析为表字段名而非参数,导致无法读取传入的数值,直接触发类型不匹配错误。
  • 字段对应隐性风险:数据库表中薪资段字段名为wmp_payband,原代码未显式指定INSERT字段列表,依赖表字段默认顺序传参,容易因结构变更或顺序记错引发匹配问题。

修正后的代码

cmdInsert.Connection = myConnection
myConnection.Open()

If txtEmpId.Text <> "" And txtName.Text <> "" And cmbSexAdd.Text <> "" And DateTimePicker1.Text <> "" And cmbDesigAdd.Text <> "" And cmbDeptIdAdd.Text <> "" And cmbPaybandAdd.Text <> "" And cmbGradepayAdd.Text <> "" And PictureBox2.Image IsNot Nothing And txtBasicAdd.Text <> "" And cmbSpAdd.Text <> "" And cmbAccoAdd.Text <> "" And cmbNehsAdd.Text <> "" Then
    ' 显式指定字段列表,与数据库表结构严格对应
    cmdInsert.CommandText = "INSERT INTO employee_main (emp_id, emp_name, emp_sex, emp_doj, emp_desig, wmp_payband, emp_gradepay, emp_dept_id, emp_photo, emp_basic, emp_sp, emp_staff_quater, emp_nehs) VALUES (@emp_id, @emp_name, @emp_sex, @emp_doj, @emp_desig, @emp_payband, @emp_gradepay, @emp_dept_id, @emp_photo, @emp_basic, @emp_sp, @emp_staff_quater, @emp_nehs)"
    cmdInsert.Parameters.AddWithValue("@emp_id", txtEmpId.Text.ToUpper)
    cmdInsert.Parameters.AddWithValue("@emp_name", txtName.Text.ToUpper)
    cmdInsert.Parameters.AddWithValue("@emp_sex", cmbSexAdd.Text.ToUpper)
    cmdInsert.Parameters.AddWithValue("@emp_doj", DateTimePicker1.Value)
    cmdInsert.Parameters.AddWithValue("@emp_desig", cmbDesigAdd.Text.ToUpper)
    cmdInsert.Parameters.AddWithValue("@emp_payband", cmbPaybandAdd.Text.ToUpper)
    cmdInsert.Parameters.AddWithValue("@emp_gradepay", Convert.ToInt32(cmbGradepayAdd.Text))
    cmdInsert.Parameters.AddWithValue("@emp_dept_id", cmbDeptIdAdd.Text.ToUpper)
    cmdInsert.Parameters.AddWithValue("@emp_photo", If(PictureBox2.Image IsNot Nothing, arrimage, DBNull.Value))
    cmdInsert.Parameters.AddWithValue("@emp_basic", Convert.ToInt32(txtBasicAdd.Text))
    cmdInsert.Parameters.AddWithValue("@emp_sp", Convert.ToInt32(cmbSpAdd.Text))
    cmdInsert.Parameters.AddWithValue("@emp_staff_quater", cmbAccoAdd.Text.ToUpper)
    cmdInsert.Parameters.AddWithValue("@emp_nehs", Convert.ToInt32(cmbNehsAdd.Text))

    cmdInsert.CommandType = CommandType.Text
    cmdInsert.Connection = myConnection
    cmdInsert.ExecuteNonQuery()
End If

额外优化建议

  • 对所有需要转换为数值的输入(如cmbGradepayAdd.Text),提前用Integer.TryParse验证有效性,避免转换异常。
  • 用VB.NET的If运算符替代IIf,前者支持短路求值,性能更优且逻辑更安全。

内容的提问来源于stack exchange,提问作者Mayank Chaurasia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 11:22:46