如何在C#中检测DataReader上的EOF而不执行Read()

010*_*101 5 c# ado.net

我熟悉使用.Read()来检测EOF

        using (IDataReader reader = SqlHelper.ExecuteReader(_connectionString, "dbo.GetOrders"))
        {
            AssertOrder(reader);

            while (reader.Read())
            {
                yield return FillRecord<Order>(reader, StringComparer.OrdinalIgnoreCase);
            }
            reader.Close();
        }
Run Code Online (Sandbox Code Playgroud)

由于我遇到了一些奇怪的情况,FillRecord实际上推动了读者.所以现在while循环中的.Read()实际上会导致这个函数跳过一些行 - 因为我们正在前进两次.

我希望有一个IDataReader.EOF,但没有.有什么想法吗?

Ste*_*eve 4

我想我可能在评论中明确表达了我的意见......但是,既然你要求“任何想法”......就在这里:

显然这是一个两秒钟的黑客工作,但你会明白的:

(你肯定想要实现 IDisposable (因为我认为 IDataReader 是??)等。可能只是让该类继承 IDataReader,并将该类实现为外观。或者变得真正酷并实现一个透明代理来劫持 Read方法。

public class DataReaderWithEOF
{
     public bool EOF { public get; private set; }
     private IDataReader reader;

     public DataReaderWithEOF(IDataReader reader)
     {
          this.reader = reader;
     }

     public bool Read()
     {
           bool result = reader.Read();
           this.EOF = !result;
           return result;
     }
}
Run Code Online (Sandbox Code Playgroud)