ado.net - 如何检查结果是否包含行? (FbDataReader.HasRows 始终返回 true!)

标签 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() 将不会获取第一行。

最佳答案

恐怕您无意中发现了 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中,继承自DbDataReaderOleDbDataReaderSqlDataReader似乎也有同样的问题,如上所述在这个MSDN link

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

关于ado.net - 如何检查结果是否包含行? (FbDataReader.HasRows 始终返回 true!),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21927499/

相关文章:

firebird - 列出 firebird 1.5 上的事件语句

c# - Entity Framework 在不同的工作站上生成不同的查询

delphi - 取消附加备份服务

sql - Wireshark - 监听 SQL 查询但没有值

c# - 具有多个批处理选择、插入、更新语句的 SqlCommand

database - 从 Firebird 1.5 迁移到 PostgreSQL-9.3

c# - 从 C# 调用存储过程时出错

c# - 使用 OleDbCommand/OleDbDataAdapter 读取 CSV 文件

c# - SQL Server 截断表 - 删除并重新创建 FK 约束脚本

.net - Entity Framework ObjectContext -> 对 native DBMS 的原始 SQL 调用