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

