我需要在列表中添加一个对象CompanyDetails,所以我从我的数据库中获取数据,并将其加载到构造函数中。
result.Add(new CompanyDetails() {
Name = dr["name"].ToString(),
City = dr["city"].ToString(),
StreetName = dr["streetName"].ToString(),
StreetNr = Convert.ToInt32(dr["apartmentNr"]),
Tax = int.Parse(dr["TAX"].ToString() )});
StreetNr
和Tax
可以包含空值。当我试图运行它时,我得到错误:
无法将对象从DBNull强制转换为其他类型
我该如何解决?我知道通常我应该检查tax或streetNr是否等于DBNull,但我不知道在这种情况下我怎么做。
这是类CompanyDetails:
public class CompanyDetails
{
public string Name { get; set; }
public string City { get; set; }
public string StreetName { get; set; }
public int? StreetNr { get; set; }
public int? Tax { get; set; }
}
答案 0 :(得分:3)
Tax = dr["TAX"] == DBNull.Value ? 0 : (int)dr["TAX"]
这将检查它是null
,如果是,则将int
值设置为0
,否则它会指定整数值。
将其应用于您的代码:
result.Add(new CompanyDetails() {
Name = dr["name"].ToString(),
City = dr["city"].ToString(),
StreetName = dr["streetName"].ToString(),
StreetNr = dr["apartmentNr"] == DBNull.Value ? 0 : (int)dr["apartmentNr"]
Tax = dr["TAX"] == DBNull.Value ? 0 : (int)dr["TAX"]
)});
编辑:
如果StreetNr
和Tax
已经是int?
类型,那么只需指定null
而不是0
。
result.Add(new CompanyDetails() {
Name = dr["name"].ToString(),
City = dr["city"].ToString(),
StreetName = dr["streetName"].ToString(),
StreetNr = dr["apartmentNr"] == DBNull.Value ? (int?)null : (int)dr["apartmentNr"]
Tax = dr["TAX"] == DBNull.Value ? (int?)null : (int)dr["TAX"]
)});
答案 1 :(得分:1)
怎么样:
object tmp = dr["apartmentNr"];
int? apartmentNr = tmp is DBNull ? (int?)null : (int)tmp;
或更容易 - 使用像“小巧玲珑”这样的工具,以避免必须做所有这些......
var row = conn.Query<CompanyDetails>("select * from ...", args).FirstOrDefault();
或:
var rows = conn.Query<CompanyDetails>("select * from ...", args).ToList();
答案 2 :(得分:1)
你应该这样做;
dr["TAX"] is DBNull ? string.Empty : dr["TAX"].ToString();
答案 3 :(得分:-1)
你可以这样做:
StreetName = (dr["streetName"] + "")
如果它为null,这应该给你一个空字符串,如果不是,则给你来自DB的字符串。