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

C# WinForm注册功能如何检测数据库Login表中Username是否已存在

C# WinForm注册模块用户名重复校验修复方案

核心改动点

  • 新增注册前用户名存在性校验逻辑,使用参数化查询避免SQL注入风险
  • 新增异常捕获逻辑,避免数据库操作出错直接导致程序崩溃
  • 改用using语句管理数据库连接生命周期,自动释放资源,避免连接泄漏
  • 补充空字段判断的严谨性,过滤空白字符输入
using System;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace Proton_System
{
    public partial class Register : Form
    {
        // 连接字符串单独封装,方便后续统一修改
        private readonly string _connStr = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\baich\Documents\Data.mdf;Integrated Security=True;Connect Timeout=30";
        
        public Register()
        {
            InitializeComponent();
        }

        private void buttonRegister_Click(object sender, EventArgs e)
        {
            // 校验空字段
            if (string.IsNullOrWhiteSpace(textBox1.Text) || string.IsNullOrWhiteSpace(textBox2.Text) || string.IsNullOrWhiteSpace(textBox3.Text))
            {
                MessageBox.Show("用户名或密码字段不能为空", "注册失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            
            // 校验两次密码一致性
            if (textBox2.Text != textBox3.Text)
            {
                MessageBox.Show("两次输入的密码不一致", "注册失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            
            // 数据库操作全局捕获异常
            try
            {
                // using语句会自动释放连接资源,无需手动关闭
                using (SqlConnection con = new SqlConnection(_connStr))
                {
                    con.Open();
                    
                    // 第一步:校验用户名是否已存在,参数化查询避免SQL注入
                    string checkSql = "SELECT COUNT(*) FROM Login WHERE Username = @Username";
                    using (SqlCommand checkCmd = new SqlCommand(checkSql, con))
                    {
                        checkCmd.Parameters.AddWithValue("@Username", textBox1.Text.Trim());
                        int userCount = (int)checkCmd.ExecuteScalar();
                        
                        // 返回结果大于0说明用户名已存在
                        if (userCount > 0)
                        {
                            MessageBox.Show("该用户名已被注册,请更换其他用户名", "注册失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            return;
                        }
                    }
                    
                    // 第二步:用户名不存在时执行插入操作
                    string insertSql = "INSERT INTO Login (Username, Password) VALUES (@Username, @Password)";
                    using (SqlCommand insertCmd = new SqlCommand(insertSql, con))
                    {
                        insertCmd.Parameters.AddWithValue("@Username", textBox1.Text.Trim());
                        insertCmd.Parameters.AddWithValue("@Password", textBox2.Text);
                        insertCmd.ExecuteNonQuery();
                    }
                    
                    MessageBox.Show("账号注册成功", "注册成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    // 注册成功直接跳转登录页
                    Login Form1 = new Login();
                    Form1.Show();
                    this.Hide();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"注册过程出现错误:{ex.Message}", "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Login Form1 = new Login();
            Form1.Show();
            this.Hide();
        }
    }
}

安全提示:上述代码为基础功能实现,生产环境禁止明文存储密码,建议使用BCrypt、SHA256加盐等方式对密码做哈希加密后再存入数据库,避免数据泄露导致用户密码直接暴露。

内容的提问来源于stack exchange,提问作者user17088449

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 10:06:03