У меня этот код, где ISTM я защищаясь кодирования против присваивающих нулям:Как я могу защитить от «Объект нельзя отбрасывать из DBNull в другие типы»?
foreach (DataRow priceAndUsageVarianceRow in _dtUsage.Rows)
{
//var pauv = new PriceAndUsageVariance
//{
// Description = priceAndUsageVarianceRow["Description"].ToString(),
// Week1Usage = Convert.ToDouble(priceAndUsageVarianceRow["Week1Usage"]),
// Week2Usage = Convert.ToDouble(priceAndUsageVarianceRow["Week2Usage"]),
// UsageVariance = Convert.ToDouble(priceAndUsageVarianceRow["UsageVariance"]),
// Week1Price = Convert.ToDecimal(priceAndUsageVarianceRow["Week1Price"]),
// Week2Price = Convert.ToDecimal(priceAndUsageVarianceRow["Week2Price"]),
// PriceVariance = Convert.ToDecimal(priceAndUsageVarianceRow["PriceVariance"]),
// PriceVariancePercentage = Convert.ToDouble(priceAndUsageVarianceRow["PriceVariancePercentage"])
//};
// Got exception with the code above; trying to prevent it with this:
var pauv = new PriceAndUsageVariance();
pauv.Description = String.Empty;
pauv.Week1Usage = 0.0;
pauv.Week2Usage = 0.0;
pauv.UsageVariance = 0.0;
pauv.Week1Price = 0.00M;
pauv.Week2Price = 0.00M;
pauv.PriceVariance = 0.00M;
pauv.PriceVariancePercentage = 0.0;
if (null != priceAndUsageVarianceRow["Description"])
{
pauv.Description = priceAndUsageVarianceRow["Description"].ToString();
}
if (null != priceAndUsageVarianceRow["Week1Usage"])
{
pauv.Week1Usage = Convert.ToDouble(priceAndUsageVarianceRow["Week1Usage"]);
}
if (null != priceAndUsageVarianceRow["Week2Usage"])
{
pauv.Week2Usage = Convert.ToDouble(priceAndUsageVarianceRow["Week2Usage"]);
}
. . .
... пока я получаю, «Объект не может быть отлит из DBNull к другим типам» определенный на итерация при последнем попытке присвоения (pauv.Week2Usage).
Это поле не отображается в классе:
public class PriceAndUsageVariance
{
public String Description { get; set; }
public Double Week1Usage { get; set; }
public Double Week2Usage { get; set; }
public Double UsageVariance { get; set; }
public Decimal Week1Price { get; set; }
public Decimal Week2Price { get; set; }
public Decimal PriceVariance { get; set; }
public Double PriceVariancePercentage { get; set; }
}
... и код прекрасно работает для большинства записей.
Что может послужить причиной этого исключения и как я могу защититься от него?
Вы можете улучшить это, используя дженерики. вам нужно сделать что-то вроде 'return (T) (row.IsDBNull (порядковый номер)? default (T): row.GetValue (порядковый номер))' в вашем методе расширения. –
@KosalaW Я не мог использовать generics, если я хочу использовать это как класс расширения. Синтаксис будет более искаженным –
Не совсем. Взгляните на мой ответ. Ну в основном это ваш ответ. не мой ответ. :) –