Linq и DBNull - Получение ошибки

Я получаю ошибку при выборе из строки. AsEnumerable (). Я использую следующий код...

var rows = ds.Tables[0].AsEnumerable();
                trafficData = rows.Select(row => new tdDataDC
                {
                    CalculationCount = row.Field<Int64>("biCalculationCountSeqID")
                    , Zone = row.Field<Int16>("siFkZoneId")
                    , Miles = row.Field<decimal>("dcMiles")
                    , Plaza = row.Field<Int16>("siFkPlazaId")
                    , VehicleCount = row.Field<int>("iVehicleCount")


                });

Большую часть времени это работает хорошо, но когда существуют ПУСТЫЕ УКАЗАТЕЛИ в базе данных, которую я получаю, эта ошибка "Не может бросить DBNull. Значение для ввода 'Системы. Int16'. Используйте nullable тип.." Как я могу исправить это? Я не хочу, чтобы мой datacontracts имел типы Nullable, я хотел бы использовать троичное или что-то, и если значение является НУЛЕВЫМ, просто используйте 0. Действительно ли это возможно?

Спасибо за любую справку,
~ck

6
задан Hcabnettek 29 June 2010 в 23:13
поделиться

2 ответа

Вот как вы проверяете наличие нулей ...

Plaza = row.IsNull("siFkPlazaId") ? 0 : row.Field<int>("siFkPlazaId")
7
ответ дан 8 December 2019 в 05:20
поделиться

Вы всегда можете добавить еще один метод расширения (не проверенный):

   public static T FieldOrDefault<T>(this DataRow row, string columnName)
   {
       return row.IsNull(columnName) ? default(T) : row.Field<T>(columnName);   
   }

Тогда ваш callite будет выглядеть так:

var rows = ds.Tables[0].AsEnumerable();
                trafficData = rows.Select(row => new tdDataDC
                {
                    CalculationCount = row.FieldOrDefault<Int64>("biCalculationCountSeqID")
                    , Zone = row.FieldOrDefault<Int16>("siFkZoneId")
                    , Miles = row.FieldOrDefault<decimal>("dcMiles")
                    , Plaza = row.FieldOrDefault<Int16>("siFkPlazaId")
                    , VehicleCount = row.FieldOrDefault<int>("iVehicleCount")


                });
11
ответ дан 8 December 2019 в 05:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: