如何检查结果是否包含行? (FbDataReader.HasRows总是返回true!)

时间:2014-02-21 07:00:03

标签: ado.net firebird

我正在使用Firebird ADO.NET数据提供程序,在我将读者传递给消费服务之前,我想确定是否返回了任何行。请考虑以下代码段:

FbCommand cmd = GetSomeCommandFromTheEther();
FbDataReader reader = cmd.ExecuteReader();

if (reader.HasRows)
    DoSomethingWith(reader);
else
    TellTheUserWeGotNothing();

我现在学到的是FbDataReader.HasRows 总是返回True。事实上,看the source code它似乎只是FbDataReader.command.IsSelectCommand的包装,不仅无用,它使属性名称“HasRows”完全用词不当。

无论如何,如何判断给定查询是否有行而不推进记录指针?请注意,我想将读者传递给外部服务;如果我致电FbDataReader.Read()检查其结果,我会消耗一行而DoSomethingWith()将无法获得第一行。

1 个答案:

答案 0 :(得分:6)

我恐怕你偶然发现Firebird限制。如以下Firebird FAQ link中所述:

  

为什么FbDataReader.HasRows总是返回true?

     

实现FbDataReader.HasRows属性以实现兼容性   只要。它总是返回true,因为Firebird没有办法   知道查询是否返回行而不是没有获取数据。

Firebird Tracker已经提到了这一点。检查问题DNET-305

另一方面,在.NET中,似乎OleDbDataReaderSqlDataReaderDbDataReader继承具有相同的问题,如此MSDN link中所述。

由于FbDataReader继承自同一个类,因此您可能需要考虑Microsoft在其MSDN文章中建议的一种解决方法,即首先执行select count(*)。当然,这是不优雅的,浪费时间和资源,但至少它可以帮助你。