Вопрос

Поле 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"

  1. Оставьте автоматически сгенерированный код в покое.Невозможно «перехватить» его генерацию, поэтому любые внесенные вами изменения гарантированно рано или поздно будут уничтожены.

  2. .NET (ну, по крайней мере, биты system.data .NET 2.0) не преобразуется из DBNull во что-либо еще.Это отстой, но ты ничего не можешь с этим поделать.

  3. Напишите метод расширения под названием 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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top