Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.07.2012, 12:08   #1
gramp
Пользователь
 
Регистрация: 26.12.2010
Сообщений: 85
По умолчанию выбрасывается исключение по DBNull

В обработчике события регулярно возникает исключение "Object cannot be cast from DBNull to other types.", хотя должен происходить выход из обработчика по return. Если есть идеи, подскажите, в чем причина подобного поведения и можно ли его избежать, не оборачивая эту конструкцию в try-catch.

Код обработчика события:

Код:
private void DataTableAddRowAsync(Object obj)
        {
            DataRow dr = (DataRow)obj;

            if (dr["field5"] == DBNull.Value)
                return;

            int fa = Convert.ToInt32(dr["field5"]);// здесь выскакивает исключение DBNull
            Interlocked.Exchange(ref faG, fa);
        }
gramp вне форума Ответить с цитированием
Старый 20.07.2012, 12:32   #2
Maxvalue
Пользователь
 
Аватар для Maxvalue
 
Регистрация: 03.07.2012
Сообщений: 18
По умолчанию

такое ощущение что там сидит переменная типа DBNull а не его значение DBNull.Value;

проверь тип переменной в dr["field5"]
Maxvalue вне форума Ответить с цитированием
Старый 20.07.2012, 12:56   #3
gramp
Пользователь
 
Регистрация: 26.12.2010
Сообщений: 85
По умолчанию

Вообще сама dr["field5"] является double, для этого и сделана конвертация в int.
И код этот работает, но иногда раз в час, а иногда раз в день выбрасывает это исключение. Не могу понять причину.
Скорость обработки важна, поэтому не хочу использовать try-catch.
gramp вне форума Ответить с цитированием
Старый 20.07.2012, 13:23   #4
Maxvalue
Пользователь
 
Аватар для Maxvalue
 
Регистрация: 03.07.2012
Сообщений: 18
По умолчанию

dr["field5"] тип object, и туда может попасть и переменная типа double и DBNull

Код:
           
              if (dr["field5"].GetType() != typeof(double))
                return;
попробуй так
Maxvalue вне форума Ответить с цитированием
Старый 20.07.2012, 13:39   #5
gramp
Пользователь
 
Регистрация: 26.12.2010
Сообщений: 85
По умолчанию

спасибо, попробую так
gramp вне форума Ответить с цитированием
Старый 20.07.2012, 13:47   #6
Reskov
Форумчанин
 
Аватар для Reskov
 
Регистрация: 17.12.2008
Сообщений: 250
По умолчанию

a так?
Код:
if (Convert.IsDBNull(dr["field5"]))
return;

или так?
Код:
int stockvalue = (dr["field5"] as int?) ?? 0;
вернет ноль в случае null

или так?
Код:
if (!DBNull.Value.Equals(dr["field5"])) return;

Последний раз редактировалось Reskov; 20.07.2012 в 13:52.
Reskov вне форума Ответить с цитированием
Старый 20.07.2012, 14:30   #7
gramp
Пользователь
 
Регистрация: 26.12.2010
Сообщений: 85
По умолчанию

благодарю, погоняю разные варианты
gramp вне форума Ответить с цитированием
Старый 20.07.2012, 18:19   #8
gramp
Пользователь
 
Регистрация: 26.12.2010
Сообщений: 85
По умолчанию

if (dr["field5"].GetType() != typeof(double))
return;
так опять выбрасывает то же самое исключение, хотя в дебаггере это поле явно определяется как object {double}. тип поля вполне определенный, поэтому причина выброса исключения непонятна.
gramp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WebClient исключение MyXa Общие вопросы .NET 4 02.02.2011 13:47
Исключение равенства. %$PROregRAMi$t% Microsoft Office Excel 2 06.06.2010 18:29
исключение из массива. Arcueid1691 Общие вопросы C/C++ 2 24.11.2009 00:54
исключение эл-ов из массива Arcueid1691 Общие вопросы C/C++ 9 08.10.2009 20:11
Исключение (Delphi) VadEr Помощь студентам 2 05.06.2009 15:29