Reader.Read()即使有行也无法读取行

时间:2012-12-12 15:39:31

标签: c# oracle datareader dbproviderfactories

我遇到一个问题,看起来读者表明它有返回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
                    } 
    }
        }
    }

5 个答案:

答案 0 :(得分:1)

对于此问题的未来读者:请注意问题是因为OP在查询中返回了太多列。请参阅以下评论中的评论。


我不太确定为什么会这样,但你真的只需要检查一次行,而不是两次,而Read()方法已经这样做了。

所以你真正需要的是

while (reader.Read())
{
    // Do your thing
} 

答案 1 :(得分:0)

在第一次调用read

之前调用MoveNext()

答案 2 :(得分:0)

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

答案 3 :(得分:0)

也许你在reader.Read()上获得了例外。

但是HasRows是属性而不是方法。你需要编写if(reader.HasRows)来编译它。

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

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

答案 4 :(得分:0)

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