似乎IDataReader.Read()总是至少有一次是真的(如果我错了,请告诉我。)那么如果没有将它包装在try / catch中,你如何判断它是否没有记录?
答案 0 :(得分:20)
if(dr.Read())
{
//do stuff
}
else
{
//it's empty
}
通常你会这样做:
while(dr.Read())
{
}
答案 1 :(得分:6)
是的,如果你想使用界面,那么Read是false是测试的唯一方法。如果您正在寻找通用的IDataReader
实施方案,可以尝试DbDataReader
并使用HasRows
属性。
答案 2 :(得分:4)
您可以将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
])。
答案 3 :(得分:2)
偶然发现了这个问题并想出了这个......
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);