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

C# Reader.Read()即使有行也无法读取行,c#,oracle,datareader,dbproviderfactories,C#,Oracle,Datareader,Dbproviderfactories,我有一个问题,读卡器表明它有来自返回的SQL的行,但是读卡器的while循环从未运行。我在reader.hasrows中放了一个messagebox作为验证,并且在while循环之后的第一行也放了一个messagebox。已执行hasrows的messagebox,但未执行读取的messagebox。这很令人费解。我尝试了对数据库的查询,它确实返回了行。下面是代码片段 using (DbConnection connection = CADBase.DbProviderFactory.Creat

我有一个问题,读卡器表明它有来自返回的SQL的行,但是读卡器的while循环从未运行。我在reader.hasrows中放了一个messagebox作为验证,并且在while循环之后的第一行也放了一个messagebox。已执行hasrows的messagebox,但未执行读取的messagebox。这很令人费解。我尝试了对数据库的查询,它确实返回了行。下面是代码片段

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
                    } 
    }
        }
    }
使用(DbConnection connection=CADBase.DbProviderFactory.CreateConnection())
{
connection.ConnectionString=CADBase.DbConnectionString;
connection.Open();
使用(DbCommand=connection.CreateCommand())
{
SQL=;
command.CommandText=SQL
使用(DbDataReader=command.ExecuteReader())
{
while(reader.Read())
{
//从来没来过这里
} 
}
}
}

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


我不太清楚为什么会发生这种情况,但实际上只需要检查一次行,而不是两次,而且
Read()
方法已经做到了这一点

所以你真正需要的是

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

在第一次调用read之前调用MoveNext()

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

可能您在
reader.read()上遇到异常

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

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

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

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

这一点在问题下方的注释中已经明确(现在已删除)。如果你有一个真实的答案,你应该把它贴出来。@RobertHarvey:添加了一个可能的(?)原因。我想OP会提到这一点。同样,代码不编译,所以,代码编译。它需要供应商提供一些自定义库。makeIthere和while语句之间没有任何区别。“它需要供应商提供一些自定义库”这是什么意思
reader.HasRows()
无法编译,因为这是一个属性而不是一个方法。但是如果循环中的代码多于
//在这里创建
,则需要一个额外的
bool
变量,当您在
中时,将该变量设置为
true
。为避免属性
HasRows
有用。在make-here和while语句之间没有代码。@SiliVestige:当我不知道什么地方出错时,我会修复看起来不正确的地方。您不需要检查两次行。试试这个;如果还是不行的话,我就给你买杯啤酒。我同意,但这让人费解。为什么它会返回有行但从不读取行?当我取出hasrows时,我得到了相同的结果。在executereader期间,我可以做些什么来获取一个值,看看它是否有一个值?幼崽。可以读取的列数似乎有限制。我把精确的查询降到了一列,结果很好。我找不到任何关于非包装dbreader的文档,以查看是否有限制,但这个包装dbreader显然有限制。谢谢你的调查提示。