无法将对象从DBNull强制转换为构造函数中的其他类型

时间:2013-11-04 13:09:51

标签: c# constructor dbnull

我需要在列表中添加一个对象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() )});

StreetNrTax可以包含空值。当我试图运行它时,我得到错误:

  

无法将对象从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; }

}

4 个答案:

答案 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"]
    )});

编辑:
如果StreetNrTax已经是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的字符串。