2008-09-09 120 views
4

看起来IDataReader.Read()总是至少有一次是真的(如果我错了,这让我知道。)那么如果没有记录而只是将它封装在try/catch中,你怎么知道它呢?检测IDataReader是否为空的最佳方法是什么?

+0

本是正确的。如果一个IDataReader正在读取一个空行集合,那么对Read()的第一次调用将返回false(假设您正在使用的具体实现已经被正确写入)。 – 2009-02-25 09:22:13

回答

13
if(dr.Read()) 
{ 
    //do stuff 
} 
else 
{ 
//it's empty 
} 

通常你会做到这一点,但:

while(dr.Read()) 
{ 
} 
+1

这是我试过的,但似乎至少有一次该条件是真的,但如果尝试从读取器中提取一个值,它会引发错误。 – 2008-09-09 02:20:36

+1

注意这一点,`Read()`[提前读者到下一行](https://msdn.microsoft.com/en-us/library/system.data.idatareader.read(v = vs.110 )的.aspx)。所以它不**只是**检查数据读取器是否包含数据 – Liam 2017-06-30 10:16:37

4

是的,如果你想使用的接口,然后阅读,直到假是检验的唯一途径。如果您正在寻找一个通用的IDataReader实现,您可以尝试DbDataReader并使用HasRows属性。

+2

DbDataReader是一个抽象类 – aku 2008-09-09 02:18:41

2

您可以只投System.Data.IDataReaderSystem.Data.Common.DbDataReader

using (System.Data.IDataReader IReader = ICommand.ExecuteReader()) 
{ 
    if (((System.Data.Common.DbDataReader)IReader).HasRows) 
    { 
     //do stuff 
    } 
} // End Using IReader 

这是纯粹的邪恶,但它(通常)工程;)

(假设你的IDataReader实例通过自定义ADO.NET提供者执行,而不是一些自定义愚蠢的类只是实施IDataReader而不是从DbDataReader [其实施IDataReader])。

2

过这个问题只是偶然与此想出了...

bool isBeforeEoF; 

do 
{ 
    isBeforeEoF = reader.Read(); 

    if (isBeforeEoF) 
    { 
     yield return new Foo() 
     { 
      StreamID = (Guid)reader["ID"], 
      FileType = (string)reader["Type"], 
      Name = (string)reader["Name"], 
      RelativePath = (string)reader["RelativePath"] 
     };   
    } 

} while (isBeforeEoF); 
相关问题