主键约束冲突求助:Blackjack游戏注册数据无法入库
解决Blackjack注册功能的主键约束冲突问题
错误原因分析
你遇到的两个报错本质都是主键字段出现重复值:
- 报错“重复键值是0”:说明主键字段未设置自动增量,每次插入时默认值为0,第二次插入就触发重复冲突。
- 泛型主键冲突:要么是主键字段(比如用户名)被重复输入,要么是主键ID未生成唯一值。
针对性解决方案
第一步:确认表的主键类型
先打开数据库,查看Tbl_registration的主键字段:
- 如果主键是自增ID类字段(比如
UserID):按方案一处理。 - 如果主键是Username字段:按方案二处理。
方案一:主键为自增ID字段时
修改表结构,开启自动增量
执行SQL语句(替换UserID为你表中的主键字段名):ALTER TABLE Tbl_registration ALTER COLUMN UserID INT IDENTITY(1,1) PRIMARY KEY;这条语句会把主键字段设置为从1开始,每次自动递增1,数据库会自动生成唯一主键值,无需手动赋值。
调整窗体跳转逻辑
你当前的按钮事件先关闭窗体再执行注册,可能导致注册逻辑失效,改为先注册再跳转:private void BtnRegistered_Click(object sender, EventArgs e) { register(); // 注册成功后再跳转登录页 if (!sql.ErrorChecking(false)) { var myForm = new Login(); myForm.Show(); Close(); } }
方案二:主键为Username字段时
注册前检查用户名是否已存在
修改register方法,先查询数据库验证用户名唯一性:void register() { // 检查用户名是否已存在 sql.Params("@Username", UNtxtBox.Text); sql.query("SELECT COUNT(*) FROM Tbl_registration WHERE Username = @Username"); if (Convert.ToInt32(sql.dt.Rows[0][0]) > 0) { MessageBox.Show("该用户名已被注册,请更换"); return; } // 执行注册插入 sql.Params("@Username", UNtxtBox.Text); sql.Params("@Password", PasswordtxtBox.Text); sql.Params("@Email", EAtxtBox.Text); sql.Params("@FirstName", FNtxtBox.Text); sql.Params("@Surname", SNtxtBox.Text); sql.Params("@DOB", DOBtxtBox.Text); sql.Params("@Mnumber", IDtxtBox.Text); sql.query("INSERT into Tbl_registration(Username, Password, Email, FirstName, Surname, DOB, Mnumber)" + "VALUES(@Username, @Password, @Email, @FirstName, @Surname, @DOB, @Mnumber)"); if (sql.ErrorChecking(true)) { return; } MessageBox.Show("注册成功||| 欢迎来到Blackjack"); }优化跳转逻辑
同方案一,确保注册成功后再跳转登录页,避免无效操作。
内容的提问来源于stack exchange,提问作者Rutters
相关产品推荐
相关产品推荐

