Как лучше всего определить, пуст ли IDataReader? - PullRequest
9 голосов
/ 09 сентября 2008

Кажется, что IDataReader.Read () всегда имеет значение true хотя бы один раз (если я ошибаюсь по этому поводу, дайте мне знать). Итак, как вы узнаете, что у него нет записей, не просто заключив его в try / catch

Ответы [ 4 ]

20 голосов
/ 09 сентября 2008
if(dr.Read())
{
   //do stuff
}
else
{
 //it's empty
}

обычно вы делаете это, хотя:

while(dr.Read())
{
}
6 голосов
/ 09 сентября 2008

Да, если вы хотите использовать интерфейс, тогда Read до false - единственный способ проверить. Если вы ищете общую реализацию IDataReader, вы можете попробовать DbDataReader и использовать свойство HasRows.

4 голосов
/ 22 апреля 2013

Вы можете просто разыграть 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]) .

2 голосов
/ 23 апреля 2015

Просто наткнулся на эту проблему и придумал это ...

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...