检测IDataReader是否为空的最佳方法是什么?

时间:2008-09-09 02:08:37

标签: c# ado.net

似乎IDataReader.Read()总是至少有一次是真的(如果我错了,请告诉我。)那么如果没有将它包装在try / catch中,你如何判断它是否没有记录?

4 个答案:

答案 0 :(得分:20)

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

通常你会这样做:

while(dr.Read())
{
}

答案 1 :(得分:6)

是的,如果你想使用界面,那么Read是false是测试的唯一方法。如果您正在寻找通用的IDataReader实施方案,可以尝试DbDataReader并使用HasRows属性。

答案 2 :(得分:4)

您可以将System.Data.IDataReader投射到System.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])。

答案 3 :(得分: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);