我正在使用 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() 将不会获取第一行。
最佳答案
恐怕您无意中发现了 Firebird
限制。如下所述Firebird FAQ link :
Why FbDataReader.HasRows returns always true?
The FbDataReader.HasRows property is implemented for compatibility only. It returns always true because Firebird doesn't have a way for know if a query returns rows of not without fetching the data.
Firebird Tracker
中已经提到了这一点。检查问题DNET-305 .
另一方面,在.NET中,继承自DbDataReader
的OleDbDataReader
和SqlDataReader
似乎也有同样的问题,如上所述在这个MSDN link 。
由于 FbDataReader
继承自与这些相同的类,因此您可能需要考虑 Microsoft 在其 MSDN 文章中建议的解决方法之一,即首先执行 select count(* )
。诚然,这很不优雅,而且浪费时间和资源,但至少它可以帮助您。
关于ado.net - 如何检查结果是否包含行? (FbDataReader.HasRows 始终返回 true!),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21927499/