Я получаю ошибку при выборе из строки. 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
Вот как вы проверяете наличие нулей ...
Plaza = row.IsNull("siFkPlazaId") ? 0 : row.Field<int>("siFkPlazaId")
Вы всегда можете добавить еще один метод расширения (не проверенный):
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")
});