You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 14:57:04