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

如何将SQL查询结果转为数组/List?改造C#单用户ID查询代码

解决C#查询数据库获取用户ID列表的问题

嘿,我来帮你搞定这个问题!你的代码现在只调用了一次reader.Read(),所以只会拿到查询结果的第一行数据。要获取所有符合条件的用户ID,我们需要循环遍历SqlDataReader的每一行,把ID收集到集合里,最后转成数组或者List就行啦。

改造后的完整代码

// 初始化一个List来存储所有用户ID,后续可以轻松转成数组
List<int> userIds = new List<int>();
int targetGrpId = 180;

// 用using语句自动管理数据库连接,不用手动Close,避免资源泄漏
using (SqlConnection con = new SqlConnection(Properties.Settings.Default.ConnectionStr))
{
    con.Open();
    string query = "Select userid from UserProfile where grpid=@id";
    
    // 同样用using管理SqlCommand资源
    using (SqlCommand command = new SqlCommand(query, con))
    {
        command.Parameters.AddWithValue("@id", targetGrpId);
        
        using (SqlDataReader reader = command.ExecuteReader())
        {
            // 循环读取每一行结果,直到Read()返回false(没有更多数据)
            while (reader.Read())
            {
                // 安全获取int类型的userid,这里两种方式都可以,选你习惯的
                // 方式1:通过列名强制转换
                // int userId = (int)reader["userid"];
                // 方式2:更严谨的类型安全读取(推荐)
                int userId = reader.GetInt32(reader.GetOrdinal("userid"));
                userIds.Add(userId);
            }
        }
    }
}

// 如果需要数组格式,直接调用ToArray()即可
int[] userIdArray = userIds.ToArray();

// 测试输出所有ID
Console.WriteLine("获取到的用户ID列表:");
foreach (int id in userIds)
{
    Console.WriteLine(id);
}

关键改进点说明

  • 资源自动释放:把SqlConnection、SqlCommand都放进using块,.NET会自动帮我们释放这些资源,不用手动调用Close(),避免忘记关闭连接导致的数据库连接池耗尽问题。
  • 遍历所有结果行:用while (reader.Read())代替原来的if (reader.Read()),这样会循环读取查询返回的每一行数据,而不是只拿第一行。
  • 类型安全取值:reader.GetInt32(reader.GetOrdinal("userid"))先通过列名找到对应的索引,再读取int类型的值,比直接强制转换更严谨,能提前发现列名拼写错误或者数据类型不匹配的问题。
  • 灵活的集合存储:用List<int>来存储结果,方便动态添加元素,最后如果需要数组格式,只需要调用ToArray()就能转换。

内容的提问来源于stack exchange,提问作者Jeya Suriya Muthumari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:49:10