![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ADO.NET: можно ли преобразовать DBNull ? [C#, WinXP]
Bronco © (2005-08-16 16:50:00)Ситуация следующая:
Есть некий класс с определенным набором полей.
Каждому полю присваиваю значения из DataTable
например:
DateOpen = Convert.ToDateTime(DT1.Rows[0]["DateOpen"]);
где DateOpen - поле класса типа DateTime.
Все хорошо до тех пор, пока в DataTable не натыкаюсь на пустое значение поля. Тут возникает exception, говорящий о том, что невозможно преобразовать DBNull в DateTime.
Конечно есть вариант каждый раз проверять поле на наличие в нем пустого значения, напр. так:
if (Convert.IsDBNull(DT1.Rows[0]["DateOpen"]))
DateOpen = Convert.ToDateTime(null);
else
DateOpen = Convert.ToDateTime(DT1.Rows[0]["DateOpen"]);
но как-то громоздко это, да и полей много, придется для каждого писать такую конструкцию.
Может есть более простые способы преобразования DBNull в нужный тип?
Спасибо заранее.
Канадец (2005-08-16 22:35:00) [21]>Bronco ©
Эта проблема не одному тебе спать не даёт. Никаких преобразований структурных типов в null, естественно, нет и как здесь правильно заметили, быть не может. Microsoft обещает исправиться в .net framework 2.0 введением Nullable Types.
DiamondShark (2005-08-16 18:49:00) [22]
> Расскажу. См. класс TField в Delphi. Он почему-то "знает"
> как преобразовывать пустое (null) значение.
Фиги разные. Класс TField ничего не преобразует. Он имеет свойство Value типа Variant (для которого значение NULL входит в множество значений) и свойство IsNull.
А методы доступа свойств AsXXX -- заглушки с исключениями.
Преобразования вводят классы-наследники.
> не понял, что в этом плохого? Ну нулевая дата, и что?
А то, что нулевая дата и null -- это разные значения.
А с целыми ты что будешь делать? Нулём заменять? Так ноль -- значение не лучше и не хуже любого другого.
> Но либо он, либо движок соответствующей БД занимается этим
> преобразованием. И точно знает во что нужно преобразовать
> null в каждом конкретном случае.
Ничем подобным никакой движок не занимается. Null -- он по-жизни Null.
Тип данных -- это множество значений. Null -- это признак значения вне множества значений. Поэтому однозначно отображаться на множество значений не может.
Только ты, как разработчик прикладной логики, можешь принять решение, на какое значение из множества значений типа тебе отображать Null.
Bronco (2005-08-16 18:04:00) [23]Дополнение: насчет TField могу ошибаться.
Но либо он, либо движок соответствующей БД занимается этим преобразованием. И точно знает во что нужно преобразовать null в каждом конкретном случае.
Bronco (2005-08-16 17:56:00) [24]
> DiamondShark © (16.08.05 17:41) [1]
> Как только ты расскажешь, какое значение, скажем, Int32
> соответсвует DBNull, я тебе тут же напишу способ преобразования.
Расскажу. См. класс TField в Delphi. Он почему-то "знает" как преобразовывать пустое (null) значение.
> Плохой вариант.
не понял, что в этом плохого? Ну нулевая дата, и что? По условию дата вполне может отсутствовать. А как по-другому инициализировать поле класса пустым значением?
DiamondShark (2005-08-16 17:41:00) [25]
> Может есть более простые способы преобразования DBNull в
> нужный тип?
Как только ты расскажешь, какое значение, скажем, Int32 соответсвует DBNull, я тебе тут же напишу способ преобразования.
> Конечно есть вариант каждый раз проверять поле на наличие
> в нем пустого значения, напр. так:
> if (Convert.IsDBNull(DT1.Rows[0]["DateOpen"]))
> DateOpen = Convert.ToDateTime(null);
> else
> DateOpen = Convert.ToDateTime(DT1.Rows[0]["DateOpen"]);
Плохой вариант.
Convert.ToXXX с аргументом null возвращает для value-типов заполненное нулями значение.
И если дата 01-01-0001 (а это и есть "нулевая" дата) хотя и вполне валидное, но несколько экзотическое значение, то, скажем, нулевой Int32 или Double -- вообще ничем не примечательны.
Никакого универсального (т.е. не зависящего от логики конкретного приложения) преобразования DBNull -> value-type нет и быть не может.
По определению.