C#俄罗斯方块游戏Top5玩家排名查询报错及格式需求求助
解决C#中DataReader未关闭错误并实现俄罗斯方块Top5排名
错误原因
出现There is already an open DataReader associated with this Command which must be closed first.错误的核心原因是:同一个数据库连接上存在未关闭的DataReader时,又尝试执行新的查询,大多是因为没有正确释放DataReader或连接资源导致的。
解决方案与代码实现
1. 最佳实践:使用using语句自动管理资源
using语句会在代码块结束时自动调用对象的Dispose()方法,确保DataReader、Command和Connection被正确关闭释放,从根源避免错误。
以下是完整的实现代码,包含查询Top5分数、格式化输出指定排名格式:
using System; using System.Data.SqlClient; class ScoreRank { static void Main() { // 替换为你的数据库连接字符串 string connectionString = "Server=你的服务器;Database=你的数据库;User Id=用户名;Password=密码;"; // 使用using包裹连接、命令、DataReader,自动释放资源 using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); // 查询Score表中分数最高的前5条记录,关联Users表确保用户有效 string query = @"SELECT TOP 5 s.userName, s.score FROM Score s INNER JOIN Users u ON s.userName = u.userName ORDER BY s.score DESC"; using (SqlCommand cmd = new SqlCommand(query, conn)) { using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { string userName = reader["userName"].ToString(); int score = Convert.ToInt32(reader["score"]); // 格式化输出,对齐用户名和分数 Console.WriteLine($"{userName.PadRight(10)}{score} points"); } } } } } }
2. 备选方案:开启MARS(多活动结果集)
如果业务场景需要在同一个连接上同时打开多个DataReader,可以在连接字符串中添加MultipleActiveResultSets=True,示例:
Server=你的服务器;Database=你的数据库;User Id=用户名;Password=密码;MultipleActiveResultSets=True;
但这种方式仅适用于特殊场景,优先推荐使用using语句管理资源,代码更简洁安全。
输出格式说明
上述代码通过PadRight(10)让用户名部分固定宽度,确保分数对齐,输出效果与你期望的一致:
user 1 99 points user 2 21 points user 3 21 points user 2 12 points user 3 4 points
内容的提问来源于stack exchange,提问作者F A Fernández
相关产品推荐
相关产品推荐

