如何修改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
相关产品推荐
相关产品推荐

