Поле набора данных DBNull -> int?
Вопрос
Поле SQLServer int.Значение иногда равно нулю.DataAdapter заполняет набор данных ОК и может отображать данные в DatagridView ОК.
При попытке программного получения данных из набора данных код получения поля набора данных выдает ошибку StronglyTypedException.
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public int curr_reading {
get {
try {
return ((int)(this[this.tableHistory.curr_readingColumn]));
}
catch (global::System.InvalidCastException e) {
throw new global::System.Data.StrongTypingException("The value for column \'curr_reading\' in table \'History\' is DBNull.", e);
}
Преодолел это, проверив наличие DBNull в методе доступа get и вернув ноль, но...Когда структура набора данных изменяется (все еще развивается), мои изменения (что неудивительно) исчезают.
Как лучше всего справиться с этой ситуацией?Кажется, я застрял с этим на уровне набора данных.Есть ли какой-то атрибут, который может указать генератору автоматического кода оставить изменения на месте?
Решение
Набор данных будет иметь логическое свойство, обозначающее ноль.
int curr_reading = ( Iscurr_readingColumnNull) ?
<default_value> : row.curr_readingColumn;
Другие советы
В конструкторе типизированных наборов данных есть nullvalue
свойство.По умолчанию его значение равно throw exception
(Следовательно, ваш сгенерированный код) Вы можете установить его на желаемое default value
..то есть.0.Тогда он вернет 0 вместо исключения.(генерируется другой код)
VS2008: это работает непосредственно в конструкторе наборов данных.
ВС2005:Он работает только для строк в дизайнере, но вы можете напрямую редактировать XSD, установив свойство msprop:nullValue="0"
Оставьте автоматически сгенерированный код в покое.Невозможно «перехватить» его генерацию, поэтому любые внесенные вами изменения гарантированно рано или поздно будут уничтожены.
.NET (ну, по крайней мере, биты system.data .NET 2.0) не преобразуется из DBNull во что-либо еще.Это отстой, но ты ничего не можешь с этим поделать.
Напишите метод расширения под названием ToNullable() или аналогичный:он может сделать это:
.
public static Nullable<T> ToNullable(this object x){
if(x == DBNull.Value)
return default(T); // return null thing
else
return (T)x;
}
тогда ты сможешь сделать
int? thing = DataRow["column"].ToNullable<int>();
Если память не изменяет, вам нужно пометить строку как редактируемую - используя .BeginEdit() или аналогичный - затем внесите изменения и сохраните строку, возможно, используя .EndEdit() или аналогичный.Возможно, вам захочется немного изучить эти методы (они могут быть в DataSet, DataTable или DataRow) — моя память немного затуманена.
Надеюсь, это поможет хотя бы немного.
if(row["curr_reading"] is DBNull){
}else{
row.curr_reading;
}