Метод расширения:
static class SqlDataRecordExtensions
{
static void SetNullableInt32(this SqlDataRecord rec, int index, Int32? value)
{
if (value.HasValue)
rec.SetInt32(index, value.GetValueOrDefault());
else
rec.SetDBNull(index);
}
}
или, чтобы использовать SetSqlInt32
, как предложил D Stanley:
static class SqlDataRecordExtensions
{
static void SetNullableInt32(this SqlDataRecord rec, int index, Int32? value)
{
rec.SetSqlInt32(index, value.HasValue ? value.GetValueOrDefault() : SqlInt32.Null);
// ^^^^^^^^^^^^^^^^^^^^^^^^^
// You can leave out the cast to (SqlInt32),
// because the conversion is implicit
}
}
Примечание, 9 декабря 2013 г .: Возвращаясь к этому ответу из-за комментария, я заметил небольшую возможность для улучшения, основанную на серии Эрика Липперта об обнуляемых микрооптимизациях, которую можно найти по адресу http://ericlippert.com/2012/12/20/nullable-micro-optimizations-part-one/.
Вкратце, хотя свойство Value
требует меньше ввода и поэтому, возможно, более оптимально для программиста, оно должно выдавать исключение, если HasValue имеет значение false. С другой стороны, метод GetValueOrDefault()
является простым полевым доступом. Из-за этого GetValueOrDefault()
требует меньше инструкций и, скорее всего, будет встроенным, поэтому он более оптимален для компилятора и процессора.