Async-DataReader HasRows为True但reader.Read()无法读取数据求助
这种情况我之前在项目里也碰到过几次,结合你已经做过的排查,给你几个具体的方向试试:
检查是否存在多结果集的情况:如果你的SQL语句包含多个
SELECT语句,或者调用的存储过程返回了多个结果集,HasRows只会检测第一个结果集是否有数据。但如果实际有效数据在后面的结果集里,直接调用reader.Read()就会跳过循环。这种情况下可以先调用reader.NextResult()切换到下一个结果集,再尝试读取。排查是否提前移动了DataReader指针:有没有在进入
while(reader.Read())循环之前,不小心调用过一次reader.Read()?比如调试时加的测试代码没删掉,导致指针已经移动到结果集末尾,后续循环自然会直接跳过。可以在循环前加个调试输出,确认reader的状态是否正常。验证SQL语句的实际执行结果:把代码里的SQL语句(包括参数的实际值)复制到数据库管理工具(比如SSMS)里直接执行,确认是否真的返回了预期的数据。有时候参数化查询的参数格式不对(比如日期、字符串格式不符合数据库要求),或者where条件的逻辑有疏漏,导致实际返回的结果集是空的,但
HasRows因为驱动特性误判为True。检查CommandBehavior的设置:如果创建DataReader时指定了
CommandBehavior参数,比如CommandBehavior.SingleRow,有没有可能限制了读取行为?虽然这种情况很少导致HasRows为True但Read()失败,但还是可以核对一下参数是否正确。尝试更新数据库驱动:极少数情况下,旧版本的数据库驱动会出现
HasRows判断错误的bug。如果以上排查都没问题,可以试试更新对应的.NET数据库驱动(比如SqlClient),看看能不能解决这个问题。
额外小技巧:在循环前可以打印
reader.FieldCount的值,看看结果集有没有字段,这也能辅助判断是不是结果集本身存在异常。
内容的提问来源于stack exchange,提问作者TheDoc

