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

如何修改C#注册代码实现数据库邮箱重复校验?

修改C#注册代码实现邮箱存在性检查

修改后的完整代码

[HttpPost("Register")]
public async Task<ActionResult<User>> Register(UserDto request)
{
    // 定义SQL语句:先检查邮箱,再执行插入
    string emailCheckQuery = @"SELECT 1 FROM dbo.Users WHERE Email = @Email";
    string insertQuery = @"
        INSERT INTO dbo.Users(UserID, Name, Email, PasswordHash, PasswordSalt)
        VALUES (@UserID, @Name, @Email, @PasswordHash, @PasswordSalt)
    ";

    // 处理密码哈希(修正原代码中重复哈希的混乱逻辑)
    CreatePasswordHash(request.Password, out byte[] passwordHash, out byte[] passwordSalt);
    var userId = Guid.NewGuid();

    // 初始化用户对象
    var user = new User
    {
        UserID = userId,
        Username = request.Username,
        Email = request.Email,
        PasswordHash = passwordHash,
        PasswordSalt = passwordSalt
    };

    string sqlDataSource = _configuration.GetConnectionString("ContactAppCon");
    using (SqlConnection myCon = new SqlConnection(sqlDataSource))
    {
        await myCon.OpenAsync();

        // 第一步:检查邮箱是否已存在
        using (SqlCommand checkCommand = new SqlCommand(emailCheckQuery, myCon))
        {
            checkCommand.Parameters.AddWithValue("@Email", request.Email);
            // ExecuteScalarAsync返回非null值表示邮箱已存在
            var emailExists = await checkCommand.ExecuteScalarAsync();
            if (emailExists != null)
            {
                return BadRequest("该邮箱已被注册");
            }
        }

        // 第二步:邮箱不存在,执行插入操作
        using (SqlCommand insertCommand = new SqlCommand(insertQuery, myCon))
        {
            insertCommand.Parameters.AddWithValue("@UserID", userId);
            insertCommand.Parameters.AddWithValue("@Name", request.Username);
            insertCommand.Parameters.AddWithValue("@Email", request.Email);
            insertCommand.Parameters.AddWithValue("@PasswordHash", passwordHash);
            insertCommand.Parameters.AddWithValue("@PasswordSalt", passwordSalt);
            
            await insertCommand.ExecuteNonQueryAsync();
        }
    }

    return Ok(user);
}

关键修改说明

  • 前置邮箱检查:在执行插入操作前,先通过SELECT 1查询快速判断邮箱是否存在,避免无效的插入操作
  • 修正冗余逻辑:移除了原方法中无用的Guid guid参数,统一生成唯一的userId,保证内存中用户对象与数据库插入的ID一致
  • 异步化操作:将同步的数据库操作替换为异步方法(OpenAsync()/ExecuteScalarAsync()/ExecuteNonQueryAsync()),符合方法的async声明
  • 优化资源使用:插入操作无需返回数据,用ExecuteNonQueryAsync()替代原代码的ExecuteReader(),提升性能
  • 错误反馈:邮箱重复时返回明确的BadRequest响应,前端可直接提示用户

额外建议

  • 给数据库的Email字段添加唯一约束/索引,从数据库层面杜绝重复邮箱,避免并发场景下的竞态问题
  • 方法开头可添加邮箱格式验证(比如用正则表达式),提前拦截无效输入
  • 确保CreatePasswordHash方法使用安全的哈希算法(如PBKDF2、bcrypt),避免明文或弱哈希存储密码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 09:01:00