在MS Access表新增AutoNumber类型id列后插入数据报错如何解决
问题解决方法
报错核心原因
- 新增AutoNumber类型的id列后,你使用的隐式字段INSERT语法
INSERT INTO 表名 VALUES(值列表)要求值的数量、顺序和表当前所有字段完全匹配。AutoNumber是自增类型,不需要手动赋值,你没有显式指定插入字段,数据库会默认把你传的第一个字符串值匹配到数值型的id列,直接触发数据类型不匹配错误。 - 所有插入值都用单引号包裹,若表中存在数字、日期类型的非文本字段,也会触发类型不匹配错误,同时字符串拼接的写法存在SQL注入风险。
- 数据库连接未做资源释放管理,容易出现连接泄露问题。
修复步骤
- 修改INSERT语句,显式指定要插入的字段列表,排除自增的id字段,字段名替换为你prod表中除id外的实际字段名即可。
- 替换字符串拼接为参数化查询,自动匹配数据类型,避免注入风险和手动处理引号的问题。
- 用
using语句管理数据库连接、命令对象的生命周期,自动释放资源无需手动调用Close方法。
修复后的代码示例:
private void button1_Click_1(object sender, EventArgs e) { // 括号内替换为你prod表除id外的实际字段名,顺序和下方参数赋值顺序完全对应即可 string insertSql = "insert into prod (字段1,字段2,字段3,字段4,字段5,字段6,字段7,字段8,字段9,字段10,字段11,字段12,字段13) values (@p1,@p2,@p3,@p4,@p5,@p6,@p7,@p8,@p9,@p10,@p11,@p12,@p13)"; using (OleDbConnection sc = new OleDbConnection(connectionString)) { using (OleDbCommand sm = new OleDbCommand(insertSql, sc)) { // OleDb仅按参数顺序匹配,和参数名无关,顺序要和上方字段顺序完全一致 sm.Parameters.AddWithValue("@p1", textBox13.Text); sm.Parameters.AddWithValue("@p2", textBox1.Text); sm.Parameters.AddWithValue("@p3", textBox2.Text); sm.Parameters.AddWithValue("@p4", textBox3.Text); sm.Parameters.AddWithValue("@p5", textBox4.Text); sm.Parameters.AddWithValue("@p6", textBox5.Text); sm.Parameters.AddWithValue("@p7", textBox6.Text); sm.Parameters.AddWithValue("@p8", textBox7.Text); sm.Parameters.AddWithValue("@p9", textBox8.Text); sm.Parameters.AddWithValue("@p10", textBox9.Text); sm.Parameters.AddWithValue("@p11", textBox10.Text); sm.Parameters.AddWithValue("@p12", textBox11.Text); sm.Parameters.AddWithValue("@p13", textBox12.Text); // 若表中存在非文本类型字段,提前做类型转换即可,示例: // sm.Parameters.AddWithValue("@pX", Convert.ToInt32(textBoxX.Text)); // 数字类型 // sm.Parameters.AddWithValue("@pY", Convert.ToDateTime(textBoxY.Text)); // 日期类型 sc.Open(); sm.ExecuteNonQuery(); } } }
如果修改后仍有报错,优先核对字段顺序和参数赋值顺序是否完全匹配,再核对每个字段的类型和传入值类型是否一致即可解决。
内容的提问来源于stack exchange,提问作者Abdul Haq Asif
相关产品推荐
相关产品推荐

