如何防止MSAccess数据库插入重复值并提示错误?
解决Access插入重复值的两种实用方案
一、数据库层面加唯一约束(推荐)
直接在Access的Taxation表中给需要唯一限制的字段(比如ShoesCode单独,或者三个字段组合)设置唯一索引,这是最可靠的防重复方式:
- 打开你的Access数据库,找到
Taxation表 - 切换到设计视图,选中要做唯一限制的字段(可多选)
- 点击顶部菜单栏的「索引」,新建索引,把「唯一」属性改成「是」
设置后数据库会自动拦截重复数据,代码只需要加异常捕获即可。
二、代码层面处理
1. 插入前先检查重复
在执行插入语句前,先查询数据库是否已有相同数据:
connection1.Open(); // 先检查当前数据是否存在 OleDbCommand checkCmd = connection1.CreateCommand(); checkCmd.CommandText = "SELECT COUNT(*) FROM Taxation WHERE ShoesBrand = @ShoesBrand AND ShoesCode = @ShoesCode AND ShoesColor = @ShoesColor"; checkCmd.Parameters.AddWithValue("@ShoesBrand", textBox1.Text); checkCmd.Parameters.AddWithValue("@ShoesCode", textBox2.Text); checkCmd.Parameters.AddWithValue("@ShoesColor", textBox3.Text); int duplicateCount = (int)checkCmd.ExecuteScalar(); if (duplicateCount > 0) { MessageBox.Show("Cannot Insert Duplicate Value"); connection1.Close(); return; } // 执行插入操作 OleDbCommand insertCmd = connection1.CreateCommand(); insertCmd.CommandText = "INSERT INTO Taxation (ShoesBrand, ShoesCode, ShoesColor) VALUES (@ShoesBrand, @ShoesCode, @ShoesColor)"; insertCmd.Parameters.AddWithValue("@ShoesBrand", textBox1.Text); insertCmd.Parameters.AddWithValue("@ShoesCode", textBox2.Text); insertCmd.Parameters.AddWithValue("@ShoesColor", textBox3.Text); insertCmd.ExecuteNonQuery(); connection1.Close(); MessageBox.Show("保存成功");
2. 捕获数据库重复插入异常(配合约束使用)
如果已经在数据库加了唯一约束,直接捕获OleDbException,判断错误码即可:
try { connection1.Open(); OleDbCommand cmd = connection1.CreateCommand(); cmd.CommandText = "INSERT INTO Taxation (ShoesBrand, ShoesCode, ShoesColor) VALUES (@ShoesBrand, @ShoesCode, @ShoesColor)"; cmd.Parameters.AddWithValue("@ShoesBrand", textBox1.Text); cmd.Parameters.AddWithValue("@ShoesCode", textBox2.Text); cmd.Parameters.AddWithValue("@ShoesColor", textBox3.Text); cmd.ExecuteNonQuery(); MessageBox.Show("保存成功"); } catch (OleDbException ex) { // Access重复唯一键的错误码:Jet引擎是3022(对应ErrorCode -2147217873),ACE引擎是2601 if (ex.ErrorCode == -2147217873 || ex.ErrorCode == 2601) { MessageBox.Show("Cannot Insert Duplicate Value"); } else { MessageBox.Show($"保存失败:{ex.Message}"); } } finally { // 确保连接一定会关闭 if (connection1.State == System.Data.ConnectionState.Open) { connection1.Close(); } }
重要提醒
你原代码里的SQL语句有错误:Values (ShoesBrand, ShoesCode, ShoesColor)应该改成Values (@ShoesBrand, @ShoesCode, @ShoesColor),不然会把字段名当作值插入,导致数据错误。
内容的提问来源于stack exchange,提问作者Jerry
相关产品推荐
相关产品推荐

