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

如何在Visual Studio C# Windows Form中向SQL数据库添加用户信息并生成唯一UserID

实现C# WinForm注册信息存入SQL数据库并自动生成主键UserID

1. 先创建SQL用户表

首先在你的SQL数据库中创建用户表,将UserID设为自增主键,数据库会自动为每条新插入的数据生成唯一ID:

CREATE TABLE Users (
    UserID INT IDENTITY(1,1) PRIMARY KEY, -- 自增主键,自动生成唯一标识
    Username NVARCHAR(50) NOT NULL UNIQUE, -- 添加唯一约束避免重复用户名
    Password NVARCHAR(255) NOT NULL -- 务必存储哈希后的密码,禁止明文存储
);

2. WinForm注册逻辑代码实现

假设注册按钮名为btnRegister,在其点击事件中编写以下代码:

using System.Data.SqlClient;
using System.Security.Cryptography;
using System.Text;
using System.Configuration;

private void btnRegister_Click(object sender, EventArgs e)
{
    // 获取并清洗输入内容
    string username = txtUser.Text.Trim();
    string rawPassword = txtPass.Text.Trim();

    // 基础输入校验
    if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(rawPassword))
    {
        MessageBox.Show("用户名和密码不能为空!");
        return;
    }

    // 读取配置文件中的数据库连接字符串(推荐方式)
    string connectionString = ConfigurationManager.ConnectionStrings["UserDbConn"].ConnectionString;

    // 对密码进行哈希处理(核心安全要求)
    string hashedPassword = HashPassword(rawPassword);

    try
    {
        // 使用using自动释放数据库连接资源
        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            conn.Open();
            // 参数化查询,彻底避免SQL注入
            string insertSql = "INSERT INTO Users (Username, Password) VALUES (@Username, @Password)";
            using (SqlCommand cmd = new SqlCommand(insertSql, conn))
            {
                cmd.Parameters.AddWithValue("@Username", username);
                cmd.Parameters.AddWithValue("@Password", hashedPassword);

                int affectedRows = cmd.ExecuteNonQuery();
                if (affectedRows > 0)
                {
                    MessageBox.Show("注册成功!");
                    // 清空输入框
                    txtUser.Clear();
                    txtPass.Clear();
                }
                else
                {
                    MessageBox.Show("注册失败,请重试");
                }
            }
        }
    }
    catch (SqlException ex)
    {
        // 针对性处理唯一约束冲突(用户名重复)
        if (ex.Number == 2627)
        {
            MessageBox.Show("该用户名已被注册,请更换");
        }
        else
        {
            MessageBox.Show($"数据库错误:{ex.Message}");
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show($"操作出错:{ex.Message}");
    }
}

// 密码哈希实现(示例用SHA256,更推荐BCrypt等带加盐的哈希算法)
private string HashPassword(string password)
{
    using (SHA256 sha256 = SHA256.Create())
    {
        byte[] passwordBytes = Encoding.UTF8.GetBytes(password);
        byte[] hashBytes = sha256.ComputeHash(passwordBytes);
        
        StringBuilder hashBuilder = new StringBuilder();
        foreach (byte b in hashBytes)
        {
            hashBuilder.Append(b.ToString("x2"));
        }
        return hashBuilder.ToString();
    }
}

3. 关键注意事项

  • 连接字符串配置:建议将连接字符串放在App.config中,方便后续修改,示例配置如下:
    <connectionStrings>
      <add name="UserDbConn" connectionString="Data Source=你的SQL服务器地址;Initial Catalog=你的数据库名;Integrated Security=True;" providerName="System.Data.SqlClient" />
    </connectionStrings>
    
  • 密码安全:示例中用了SHA256哈希,更推荐使用BCrypt(可通过NuGet安装BCrypt.Net-Next包),它自带加盐机制,能有效抵御彩虹表攻击。
  • 异常处理:针对SqlException的错误码做针对性处理,能提升用户体验,避免模糊的错误提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 18:25:39