Access插入用户记录提示tbl_routines需关联记录报错如何解决
修复方案
报错原因
这个报错是外键参照完整性约束触发导致的,你虽然设置了routine_id字段非必填,但大概率踩了两个Access的常见坑:
tbl_users的routine_id字段默认值被设为了0,你插入数据时没有给这个字段赋值,数据库自动填了0,但tbl_routines表中没有id=0的记录,直接触发约束报错- 你两表之间的1对多关系开启了强制参照完整性,部分版本的Access默认不允许外键字段留空,哪怕你设了非必填也没用。
操作步骤
1. 调整数据库配置
首先打开Access数据库做两处修改:
- 打开
tbl_users的设计视图,找到routine_id字段,把「必填」设为「否」,「默认值」那一栏直接清空,不要留任何内容。 - 打开数据库的关系界面,双击
tbl_routines和tbl_users之间的连线:- 如果你不需要严格校验后续
routine_id的合法性,直接取消勾选「实施参照完整性」,保存即可。 - 如果你需要保留校验逻辑,只要保证上面的字段设置正确,留空是符合约束要求的,不用关参照完整性。
- 如果你不需要严格校验后续
2. 优化插入代码(强烈建议改)
你现在的SQL是字符串拼接的,很容易被SQL注入攻击,而且可以显式指定插入空的routine_id,彻底避免默认值的问题,修改后的代码如下:
if (txtRegPass.Text == txtRegPassConf.Text) { con.Open(); // 显式指定routine_id字段,避免默认值干扰 string register = "INSERT INTO tbl_users (username, [password], routine_id) VALUES (?, ?, ?)"; cmd = new OleDbCommand(register, con); // 用参数化传值,杜绝SQL注入风险 cmd.Parameters.AddWithValue("@username", txtRegUser.Text); cmd.Parameters.AddWithValue("@password", txtRegPass.Text); cmd.Parameters.AddWithValue("@routine_id", DBNull.Value); // 显式插入空值 cmd.ExecuteNonQuery(); con.Close(); MessageBox.Show("账号创建成功", "注册成功", MessageBoxButtons.OK, MessageBoxIcon.Information); txtRegUser.Text = ""; txtRegPass.Text = ""; txtRegPassConf.Text = ""; } else { MessageBox.Show("两次输入的密码不一致", "注册失败", MessageBoxButtons.OK, MessageBoxIcon.Error); txtRegPass.Text = ""; txtRegPassConf.Text = ""; }
内容的提问来源于stack exchange,提问作者Cyro1_
相关产品推荐
相关产品推荐

