SqlDataReader нет данных, но HasRow верен

Я читаю данные из базы данных SQL с помощью ExecuteReader(). Условия выполнения данных отсутствуют, но HasRow возвращает true. Когда я пытаюсь прочитать данные из программы чтения, я получаю исключение: 'Данные пусты. Этот метод или свойство нельзя вызывать для нулевых значений.'

SqlDataReader reader = command.ExecuteReader();     
if (reader.HasRows)
            try
            {
                if (reader.Read())
                {
                        string aa = reader.GetFieldType(0).Name; // aa returns 'DateTime'
                        dateStart.MinDate = reader.GetDateTime(0); //exception on this line
                        dateEnd.MinDate = reader.GetDateTime(0);
                        dateStart.Value = reader.GetDateTime(0);
                }
            }
            finally
            {
               reader.Close();
            }

Заранее спасибо


person Usjwo    schedule 23.08.2017    source источник
comment
Вы проверили значение с помощью if (reader.IsDBNull(0)) или тернарного оператора? Вы не можете использовать GetDateTime, если соответствующее значение поля равно null.   -  person Tetsuya Yamamoto    schedule 23.08.2017
comment
Большое спасибо! Оно работает :)   -  person Usjwo    schedule 23.08.2017


Ответы (1)


Если данные внутри нулевого индекса SqlDataReader содержат DBNull, вы не можете использовать метод GetDateTime непосредственно из него, поскольку DBNull.Value нельзя напрямую преобразовать в DateTime. Вы можете проверить это, используя com">IsDBNull с тернарным оператором и переменной Nullable<DateTime> для хранения результата GetDateTime перед назначением другим свойствам (см. также этот пример):

using (SqlDataReader reader = command.ExecuteReader())
{
    if (reader.HasRows)
    {
        try
        {
            while (reader.Read())
            {
                DateTime? minDate = reader.IsDBNull(0) ? (DateTime?)null : reader.GetDateTime(0);
                if (minDate != null)
                {
                    dateStart.MinDate = minDate.Value;
                    dateEnd.MinDate = minDate.Value;
                    dateStart.Value = minDate.Value;
                }
            }
        }
        finally
        {
            reader.Close();
        }
    }
}
person Tetsuya Yamamoto    schedule 23.08.2017