C#新手插入SQL数据触发PK_SES主键约束重复键错误求解决方法
错误原因
违反PRIMARY KEY约束“PK_SES”,无法在对象“dbo.SES”中插入重复键,重复键值为(456785)
该报错是因为SES表中Registration Number(注册号)字段为主键,主键要求全局唯一,不允许出现重复值,触发报错的直接原因有两个:
- 代码重复执行插入操作:你在判断插入结果前已经调用了一次
cmd.ExecuteNonQuery(),if判断语句中又调用了一次该方法,相当于同样的数据连续插入两次,第一次插入成功后,第二次插入就会触发主键重复错误。 - 输入的注册号已存在:如果你输入的注册号之前已经录入到
SES表中,无论执行几次插入都会触发该报错。
修复代码
只需要删掉多余的第一行cmd.ExecuteNonQuery()即可解决重复执行的问题,以下是优化后的代码,补充了异常捕获逻辑,避免程序直接崩溃:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Data.Sql; using System.Data.SqlClient; namespace DiTEC_Assignment { public partial class SES : Form { SqlConnection conn; SqlCommand cmd; SqlDataAdapter sda; public SES() { InitializeComponent(); } private void btnInsert_Click(object sender, EventArgs e) { try { using var conn = new SqlConnection(@"Data Source=TS-G5\SQLEXPRESS;Initial Catalog=EsoftProj;Integrated Security=True"); using var cmd = new SqlCommand("INSERT INTO SES([Registration Number], [Student Name], [Date of Birth], Gender, [Contact Number], [Course enrolled in]) VALUES (@RegistrationNumber,@StudentName,@DateOfBirth,@Gender,@ContactNumber,@CourseEnrolledIn)", conn); conn.Open(); cmd.Parameters.Add("@RegistrationNumber", SqlDbType.Int).Value = Convert.ToInt32(RegNumTB.Text); cmd.Parameters.Add("@StudentName", SqlDbType.Text).Value = StudentNameTB.Text; cmd.Parameters.Add("@DateOfBirth", SqlDbType.Date).Value = DoBPick.Value.Date; cmd.Parameters.Add("@Gender", SqlDbType.Text).Value = GMale.Checked ? "M" : "F"; cmd.Parameters.Add("@ContactNumber", SqlDbType.Int).Value = Convert.ToInt32(ContactNumTB.Text); cmd.Parameters.Add("@CourseEnrolledIn", SqlDbType.Text).Value = CourseEnrSel.GetItemText(CourseEnrSel.SelectedItem); // 直接用执行返回值判断结果,避免重复执行 int affectedRows = cmd.ExecuteNonQuery(); if(affectedRows > 0) { MessageBox.Show("Record inserted"); } else { MessageBox.Show("Record failed"); } } catch (SqlException ex) { // 2627是SQL Server主键唯一约束冲突的错误码,单独捕获给出友好提示 if (ex.Number == 2627) { MessageBox.Show($"输入的注册号{RegNumTB.Text}已存在,请勿重复录入"); } else { MessageBox.Show($"数据库操作出错:{ex.Message}"); } } catch (Exception ex) { MessageBox.Show($"操作出错:{ex.Message}"); } } } }
可选优化建议
如果需要进一步避免用户输入重复注册号的问题,可以在插入前先执行查询语句判断该注册号是否已经存在,确认不存在后再执行插入操作。
内容的提问来源于stack exchange,提问作者Zass
相关产品推荐
相关产品推荐

