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
相关产品推荐
相关产品推荐

