[英]System.InvalidCastException in IList object creation
應該使用以下代碼將DataTable
轉換為對象的IList
。 問題是,如果DataTable
有一個空值,它將生成一個DBNull
錯誤。
在將值分配給Deduction
對象的屬性之前,是否可以檢查空值?
public IList<Deduction> PrepareDeductions() //Entry point
{
return GetDeductionsToList();
}
public IList<Deduction > GetDeductionsToList()
{
return CalculateDeductions().Rows.OfType<DataRow>().Select(CreateDeductions).ToList();
}
private DataTable CalculateDeductions()
{
return _DataService.GetDeductions();
}
private static Deduction CreateDeductions(DataRow row)
{
return new Deduction()
{
EmployeeID = Convert.ToInt32(row[0]),
EPFAmount = Convert.ToDecimal(row[2]),
AdvanceAmount = Convert.ToDecimal(row[3]),
MealsAmount = Convert.ToDecimal(row[4]),
LoanInstalmentAmount = Convert.ToDecimal(row[5]),
UniformInstalmentAmount = Convert.ToDecimal(row[6]),
InsuranceInstalmentAmount = Convert.ToDecimal(row[7]),
FineAmount = Convert.ToDecimal(row[8]),
DeathDonationAmount = Convert.ToDecimal(row[9]),
WelfareAmount = Convert.ToDecimal(row[10]),
};
}
您可以使用IsNull
檢查是否為空; 參見http://msdn.microsoft.com/en-us/library/chk182xa.aspx
private static Deduction CreateDeductions(DataRow row)
{
return new Deduction()
{
EmployeeID = row[0] == DBNull.Value ? 0 : Convert.ToInt32(row[0]),
EPFAmount = row[2] == DBNull.Value ? 0 : Convert.ToDecimal(row[2]),
AdvanceAmount = row[3] == DBNull.Value ? 0 : Convert.ToDecimal(row[3]),
MealsAmount = row[4] == DBNull.Value ? 0 : Convert.ToDecimal(row[4]),
LoanInstalmentAmount = row[5] == DBNull.Value ? 0 : Convert.ToDecimal(row[5]),
UniformInstalmentAmount = row[6] == DBNull.Value ? 0 : Convert.ToDecimal(row[6]),
InsuranceInstalmentAmount = row[7] == DBNull.Value ? 0 : Convert.ToDecimal(row[7]),
FineAmount = row[8] == DBNull.Value ? 0 : Convert.ToDecimal(row[8]),
DeathDonationAmount = row[9] == DBNull.Value ? 0 : Convert.ToDecimal(row[9]),
WelfareAmount = row[10] == DBNull.Value ? 0 : Convert.ToDecimal(row[10]),
};
}
不確定,但您可以檢查像
if (row[0] != System.DBNull.Value))
{
EmployeeID = Convert.ToInt32(row[0]);
}
else
{
EmployeeID = somethingelse;
}
您可以使用DataRow.Field
擴展方法,該方法對DB中的可為空的值提供了更好的支持,並且不返回DBNull
。 您的屬性應該可以為空-例如int?
, decimal?
。
EmployeeID = row.Field<int?>(0);
EPFAmount = row.Field<decimal?>(2);
etc.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.