![](/img/trans.png)
[英]reader.Read() only read once even when there are multiple rows to read
[英]Reader.Read() fails to read rows even though it has rows
我有一个问题,似乎阅读器指示它具有返回的SQL中的行,但阅读器的while循环从未运行。 我将一个消息框放在reader.hasrows中作为验证,并将消息框放在while循环之后的第一行。 哈希的消息框已执行,但读取的消息框未执行。 非常令人困惑。 我尝试对数据库查询,它确实会返回行。 这是代码片段。
using (DbConnection connection = CADBase.DbProviderFactory.CreateConnection())
{
connection.ConnectionString = CADBase.DbConnectionString;
connection.Open();
using (DbCommand command = connection.CreateCommand())
{
SQL = <statement here>;
command.CommandText = SQL
using (DbDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
//NEVER MAKES IT HERE
}
}
}
}
给以后这个问题的读者:请注意,发生此问题是因为OP在查询中返回了太多列。 请参阅此答案下面的评论。
我不太确定为什么会这样,但是您实际上只需要检查一次而不是两次,并且Read()
方法已经做到了。
所以你真正需要的是
while (reader.Read())
{
// Do your thing
}
在第一次调用之前调用MoveNext()
您应该使用reader.HasRows属性,而不是方法。
也许您在reader.Read()
上遇到了异常。
但是由于HasRows
是属性而不是方法。 您需要编写if(reader.HasRows)
进行编译。
if(reader.HasRows)
{
//MAKES IT HERE
while (reader.Read())
{
//NEVER MAKES IT HERE
}
}
所以我想知道实际的代码是什么。
只是一个猜测。 也许您正在显示在reader.HasRows之后,reader.Read()之前的消息框中的reader对象。 显然,仅当阅读器未到达最后一行时,Read()方法才返回true(请参阅: https : //stackoverflow.com/a/1540626/516481 )。 因此,如果读者在最后一行,它将返回false! 也许查询仅返回一行,并且您通过访问读取器对象(也许使用调试器)并以某种方式更改读取器对象的内部状态并将读取器移至最后一行?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.