Как вы обрабатываете тип Nullable с помощью SqlDataRecord
-
28-10-2019 - |
Вопрос
Я разбираю XML (LINQ to XML) и использую тип, допускающий значение NULL (int?
и decimal?
) в тех случаях, когда элемент / атрибут пуст.Однако при создании моей коллекции для передачи в БД (с использованием TVP) я не знаю, как обрабатывать случаи, когда значение фактически равно нулю.Я не могу передать значение NULL в SqlDataRecord SetInt32 или SetDecimal, и я не хочу устанавливать его в ноль .... Я действительно хочу, чтобы оно было равно NULL.
Сообщаете, что нет перегрузки для генерального кода тегов?
Счетчик ниже - это тип, допускающий значение NULL (счётчик сгенерированного кода кода)
родовое словоЕсть идеи, как справиться с этим, не передавая ноль (сохраняя ноль)?
Решение
Способ расширения:
родовое словоили, чтобы использовать общий код кода, как было предложено Д. Стэнли:
родовое словоПримечание, 9 декабря 2013 г. Возвращаясь к этому ответу из-за комментария, я заметил небольшую возможность для улучшения, основанную на серии статей Эрика Липперта о микрооптимизациях, допускающих значение NULL, которые можно найти по адресу http://ericlippert.com/2012/12/20/nullable-micro-optimizations-part-один / .
Вкратце, хотя свойство SetSqlInt32
требует меньше ввода и поэтому, возможно, более оптимально для программиста, оно должно генерировать исключение, если HasValue имеет значение false.С другой стороны, метод Value
- это простой доступ к полю.Из-за этого для кода GetValueOrDefault()
требуется меньше инструкций, и он с большей вероятностью будет встроен, поэтому он более оптимален для компилятора и процессора.
Другие советы
Я никогда не работал с SqlDataRecord
, но при использовании DataTable
и DataRow
или при использовании параметризованных запросов я указываю null
с помощью DBNull.Value
.
С помощью SqlDataRecord
, похоже, вы можете использовать метод SetDBNull
.
Следует использовать SetSqlInt32
вместо SetString
.Попробуйте
// Я обнаружил, что это работает лучше всего для меня при проверке или работе с типами, допускающими значение NULL // в моем примере я проверяю значения, хранящиеся в массиве String []
родовое слововозможно, вы можете попробовать следующее.
родовое слово