C# 如何将SQL查询到的USER_ID赋值给变量并正确返回
你现在写的代码存在几个明显的核心问题:
- 有SQL注入高危漏洞:直接把用户名参数拼接到SQL语句中,攻击者可以构造特殊用户名执行任意SQL操作,比如删库、拖取全表数据
- 命令和连接未关联、也没有执行查询:你创建的SqlCommand没有绑定SqlConnection对象,全程也没有打开数据库连接、执行查询的逻辑
- 取值逻辑错误:你调用
Convert.ToInt32(cmd.CommandText)是把SQL语句的字符串本身转成整数,根本没有拿到数据库的查询结果 - 未释放非托管资源:SqlConnection、SqlCommand都属于需要手动释放的非托管资源,不主动释放会导致数据库连接泄漏,后续可能出现连接池占满的问题
下面是修正后的正确实现:
private int GetUserId(string username) { // using语法会在代码块结束后自动释放资源,不需要手动关闭连接 using (SqlConnection con = new SqlConnection(_conString)) using (SqlCommand cmd = new SqlCommand()) { cmd.Connection = con; cmd.CommandType = CommandType.Text; // 参数化查询,彻底避免SQL注入 cmd.CommandText = "SELECT USER_ID FROM tblUser WHERE USERNAME = @Username"; // 添加参数,绑定传入的用户名 cmd.Parameters.AddWithValue("@Username", username); // 打开数据库连接 con.Open(); // ExecuteScalar返回查询结果的第一行第一列,刚好匹配取单个USER_ID的场景 object result = cmd.ExecuteScalar(); // 处理查询不到对应用户的情况,可根据业务需求调整返回值或者抛出异常 if (result == null || result == DBNull.Value) { // 示例:用户不存在返回-1,可自定义逻辑 return -1; } return Convert.ToInt32(result); } }
补充注意点:
- 如果业务逻辑中不允许不存在的用户名传入,可以在
result为空的分支抛出自定义异常,而不是返回-1 - 如果USER_ID字段本身是可空类型,可以把方法返回值改成
int?来适配空值场景
内容的提问来源于stack exchange,提问作者Muha18
相关产品推荐
相关产品推荐

