看起来IDataReader.Read()至少会返回true一次(如果我对此有误,请告诉我)。那么,你如何判断它是否没有记录,而不仅仅是将其包装在try / catch中?
看起来IDataReader.Read()至少会返回true一次(如果我对此有误,请告诉我)。那么,你如何判断它是否没有记录,而不仅仅是将其包装在try / catch中?
if(dr.Read())
{
//do stuff
}
else
{
//it's empty
}
通常情况下,您会这样做:
while(dr.Read())
{
}
Read()
会使读取器前进到下一行。因此它不仅仅是检查数据读取器是否包含数据。 - Liam如果你想使用接口,则只有在读取到 false 时才能进行测试。如果你正在寻找通用的 IDataReader
实现,可以尝试使用 DbDataReader
并使用 HasRows
属性。
IDataReader
对象 上调用 Read()
,因为这样的东西根本不存在。而且在几乎所有的实现中,你会得到一个 DbdataReader
对象。所以,除非你有将类“降级”回 IDataReader
作为它们的返回类型,否则你可以直接调用它。即使它被降级了,检查一下也是值得的:if (reader is DbDataReader) return ((DbDataReader)reader).HasRows
。 - Nyerguds您可以将 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
])。
刚刚遇到了这个问题,找到了一个解决方法...
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);