我正在使用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()
将无法获得第一行。
答案 0 :(得分:6)
我恐怕你偶然发现Firebird
限制。如以下Firebird FAQ link中所述:
为什么FbDataReader.HasRows总是返回true?
实现FbDataReader.HasRows属性以实现兼容性 只要。它总是返回true,因为Firebird没有办法 知道查询是否返回行而不是没有获取数据。
Firebird Tracker
已经提到了这一点。检查问题DNET-305。
另一方面,在.NET中,似乎OleDbDataReader
和SqlDataReader
从DbDataReader
继承具有相同的问题,如此MSDN link中所述。
由于FbDataReader
继承自同一个类,因此您可能需要考虑Microsoft在其MSDN文章中建议的一种解决方法,即首先执行select count(*)
。当然,这是不优雅的,浪费时间和资源,但至少它可以帮助你。