代码初始运行几次后为何出现空SqlDataReader?
问题排查与修复方案
针对你代码中出现的空数据阅读器问题,结合代码细节整理出以下修复点:
1. 修复连接初始化的语法错误
原代码中SqlConnection的using语句缺少闭合括号,会导致连接创建失败,直接引发数据阅读器为空:
// 错误写法 using (SqlConnection sqlConnection = new SqlConnection(_sqlConnectionStr) // 修复后 using (SqlConnection sqlConnection = new SqlConnection(_sqlConnectionStr))
2. 循环读取所有结果行
原代码用if (dataReader.Read())仅读取第一行数据,若结果集为空则直接跳过,需改为while循环遍历所有行:
// 错误写法 if (dataReader.Read()) // 修复后 while (dataReader.Read()) { System.Diagnostics.Debug.WriteLine(dataReader); requests.Add(new Request() // 确保类型与List<Request>匹配 { com = dataReader.GetFieldValue<int>(0), req = dataReader.GetFieldValue<Guid>(1), st = dataReader.GetFieldValue<int>(3), }); }
3. 修正Debug输出的未定义变量
原代码中queryString未声明,直接输出会引发异常中断执行,替换为实际的查询变量:
// 错误写法 System.Diagnostics.Debug.WriteLine(queryString); // 修复后 System.Diagnostics.Debug.WriteLine(query);
4. 统一对象类型匹配
方法返回List<Request>,但原代码添加的是RequestHeader实例,若两者无继承关系会导致类型错误,需替换为Request类型实例:
// 错误写法 requests.Add(new RequestHeader() // 修复后(确保Request类包含对应属性) requests.Add(new Request() { com = dataReader.GetFieldValue<int>(0), req = dataReader.GetFieldValue<Guid>(1), st = dataReader.GetFieldValue<int>(3), });
5. 验证查询语句拼接的合法性
确保initial基础查询结尾包含WHERE 1=1,否则拼接条件时会出现SQL语法错误(比如SELECT ... AND id=@Id):
// 示例initial的正确格式 string initial = "SELECT com, req, xxx, st FROM YourTable WHERE 1=1";
6. 确认字段索引与类型匹配
检查initial对应的SELECT语句中,第0列是int类型的com、第1列是Guid类型的req、第3列是int类型的st,索引或类型不匹配会抛出异常,导致阅读器无法正常读取数据。
内容的提问来源于stack exchange,提问作者abczyx
相关产品推荐
相关产品推荐

