1

我有一个问题,阅读器似乎表明它具有来自返回的 SQL 的行,但阅读器的 while 循环从未运行。我在 reader.hasrows 中放了一个消息框作为验证,我也在 while 循环之后的第一行放了一个消息框。hasrows 的消息框已执行,但 Read 的消息框未执行。这是非常令人费解的。我尝试了对数据库的查询,它确实返回了行。这是代码片段。

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
                    } 
    }
        }
    }
4

5 回答 5

2

对于这个问题的未来读者:请注意,问题的发生是因为 OP 在查询中返回了太多列。请参阅此答案下方的评论。


我不太确定为什么会发生这种情况,但是您实际上只需要检查一次行,而不是两次,并且该Read()方法已经这样做了。

所以你真正需要的是

while (reader.Read())
{
    // Do your thing
} 
于 2012-12-12T15:45:44.343 回答
0

在第一次调用读取之前调用 MoveNext()

于 2012-12-12T15:46:19.167 回答
0

您应该使用 reader.HasRows 属性而不是方法。

于 2012-12-12T15:47:07.213 回答
0

也许你在reader.Read().

但是因为HasRows是属性而不是方法。您需要编写if(reader.HasRows)以使其编译。

if(reader.HasRows)
{           
    //MAKES IT HERE   
    while (reader.Read())
    {
        //NEVER MAKES IT HERE
    } 
} 

所以我想知道实际的代码是什么。

于 2012-12-12T15:48:23.610 回答
0

只是一个猜测。也许您正在访问 reader.HasRows 之后和 reader.Read() 之前显示的消息框中的 reader 对象。显然,仅当阅读器未到达最后一行时,Read() 方法才返回 true(请参阅:https ://stackoverflow.com/a/1540626/516481 )。因此,如果阅读器位于最后一行,它将返回 false!也许查询只返回一行,并且您通过访问它(可能使用调试器)并将读取器移动到最后一行以某种方式更改读取器对象的内部状态?

于 2012-12-12T16:25:55.393 回答