Ваша ошибка не воспроизводима.
Следующий тест:
SELECT (CONVERT(DATE, (CONVERT(varchar, 'Oct') + ' 1 ' + CONVERT(varchar, '2017'))))
Не выдает ошибку и приводит к:
2017-10-01
Ошибка должна быть либо в другой части кода, либо из-за некоторых данных в вашей таблице за пределами того, что вы описали (действительный месяц / год)
Конечно.
System.DBNull
класс, который был (и все еще), используемый ADO.NET для представления a null
значение в базе данных.
null
на самом деле a null
ссылка, и в Вашем коде приложения любой ссылочный тип должна использовать null
как, ну, в общем, null
значение.
Использование MinValue
для различных типов примитивов (который, так как они - типы значения, не может быть присвоен null
) относится ко времени темных дней перед C# 2.0, который представил дженерики. Теперь предпочтительный метод для представления nullable типа примитива состоит в том, чтобы использовать Nullable<T>
универсальный тип, обычно представленный в стенографии с вопросительным знаком после типа примитива. Например, я мог объявить nullable int
переменную называют foo
в C# как:
Nullable<int> foo;
или
int? foo;
Оба идентичны.
null
только допустимо для ссылочных типов: типы, которые являются a class
вместо a structure
.type.MinValue
, но могло бы быть что-то (рассмотрите булевскую переменную, например). Nullable<T>
для того, когда у Вас есть тип значения, который мог бы действительно быть пустым. Значение по умолчанию (возможно, MinValue) также допустимо, и необходимо отличить его от того, когда переменная еще не была присвоена. В C# можно ли использовать a? со значением вводят как нотация стенографии (например: int?
), но Вы все еще создаете то же Nullable<T>
.DBNull
конкретно относится к Нулевым значениям от базы данных. Это не то же самое как использующий пустой указатель в другом месте на языке: это только для того, чтобы говорить с базой данных, таким образом, можно знать, когда запрос возвратил нулевое значение.default(T)
создайте используемый, где T является параметром типа. Это позволяет Вам устанавливать значение по умолчанию типа, не зная, является ли тот тип ссылочным типом или типом значения, а тем более каково определенное значение по умолчанию типа значения могло бы быть.A Null
значение представляет любой объект ссылочного типа, которому еще не выделили его память.
MinValue
не представляет a Null
, скорее это - свойство, которое часто используется для представления самой маленькой постоянной величины, которую может иметь данный тип значения.
DBNull.Value
класс является отображением Пустых указателей, возвратился/передал к базе данных.
Универсальный тип Nullable позволяет Вам присвоить Нулевые значения типу Значения.
"MinValue
"s использовались с типами значения, прежде чем nullable типы пришли в C# 2.0. Таким образом, существует много унаследованного кода, который использует старый стиль знания, когда тип значения не имеет значения. В наше время намного легче использовать a DateTime? date = null
чем DateTime date = DateTime.MinValue
. Насколько DBNull идет, который является чем-то, что требуется как уровень абстракции к базам данных, но можно избежать необходимости соглашение с ним сами путем использования ORM, такого как NHibernate или некоторые такой - Вы в значительной степени из приложения. точка зрения разработки должна будет только иметь дело со встроенными типами C#.
Ссылочные типы (иначе объекты) могут быть установлены в NULL начиная с переменных ссылочного типа просто указатель на фактический экземпляр. Указание на отсутствие экземпляра легко, так как можно установить переменную в NULL непосредственно.
Поскольку значение вводит, это немного более твердо, так как переменная типа значения всегда содержит значение. Поэтому использование Дважды. MinValue или DateTime. MinValue был несколько допустим в pre-Nullable дни. Тогда не было никакого простого способа выразить отсутствие значения в типах значения.
Теперь, с nullable типами можно сказать:
double? d = null;
И таким образом у Вас могут также быть переменные типа значения, содержащие пустой указатель.
Система. DBNull является другой историей, так как он непосредственно связывается с выражением значения "ПУСТОЙ УКАЗАТЕЛЬ" в наборах данных. Это было представлено перед nullable типами, какой imo заменяет DBNull.
MinValue не является пустым. Это - MinValue. Это иногда используется "в качестве пустого указателя" людьми, использующими C# 1.0, который не имел nullable типов значения. Вместо этого они должны использовать Nullable, ot DateTime?.
DBNull является значением.NET, которое используется для общения с базой данных (пустой указатель "DB"). Понятие базы данных ПУСТЫХ средств что-то другое от нулевой ссылки.NET. В терминах базы данных ПУСТОЙ УКАЗАТЕЛЬ означает "неизвестный" или "отсутствующий".
Большинство типов в.NET является ссылочными типами, и null
"не ссылка", которая может быть присвоена переменной или полю, чтобы указать, что нет никакого объекта.
Все другие типы в.NET являются типами значения. Всегда существует значение с типом значения, таким образом, никакая способность не указать "ни на какое значение". Поэтому реализация может определить определенные специальные значения для указания на это. Часто тип значения MinValue
(постоянное) поле используется для этого. Так использование DateTime.MinValue
поскольку дата рождения может указать "не известный" или "не применимый" (например, для корпоративного объекта).
DbNUll
существует для выражения значения RDBMS NULL
который немного отличается от.NET. В большинстве случаев это будет переведено в пустой или подобное.
Наконец, Nullable<T>
обертка для типов значения к более непосредственно специальному, "не известному", и обычно более оптимальный вариант, чем использование MinValue
, но был добавлен в.NET 2, таким образом, более старые проекты, возможно, начали использовать MinValue
прежде Nullable<T>
доступно.
лучший способ для tou для понимания этого различные нулевые значения состоят в том, чтобы судить их и видеть то, что использование каждого, но сделать вещи простыми вот некоторая инструкция
потому что мы наклоняемся, присваивают пустой указатель десятичному числу, или дважды мы присваиваем им со свойством MinValue (они - объекты значения),
Nullable является способом для разработчика присвоить нулевые значения для оценки объектов как десятичное число, Nullable<int> is same as int?
я надеюсь, что помог Вам понимающий различия.
Важное различие здесь то, что между типами значения и ссылочными типами. Типы значения представляют непосредственно определенное значение, тогда как ссылочные типы указывают на ячейку памяти, которая должна представить значение. Когда ссылочный тип на самом деле не указывает на ячейку памяти с допустимым содержанием, ссылка является Нулевой.
Так как типы значения являются прямыми представлениями значения, они не могут быть пустыми. Однако могло бы иметь место, что фактическое значение типа значения неизвестно. Для этого случая .NET обеспечивает конструкцию типов Nullable. Когда такая конструкция не доступна, однако, люди склонны использовать специальное предложение или значения по умолчанию, такие как MinValue.
При общении с базами данных большим количеством вещей мы ожидаем быть типами значения, может на самом деле быть Пустым, начиная с этого это способ, которым база данных обрабатывает неизвестные значения. Это может также быть решено типами Nullable, но они были не всегда доступны. Вот почему DBNull существуют, для контакта с возможным пустым указателем в базе данных.