1

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

}
4

4 回答 4

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"]
    )});
于 2013-11-04T13:14:00.663 回答
1

怎么样:

object tmp = dr["apartmentNr"];
int? apartmentNr = tmp is DBNull ? (int?)null : (int)tmp;

或更简单 - 使用像“dapper”这样的工具来避免不得不做所有这些事情......

var row = conn.Query<CompanyDetails>("select * from ...", args).FirstOrDefault();

或者:

var rows = conn.Query<CompanyDetails>("select * from ...", args).ToList();
于 2013-11-04T13:12:24.147 回答
1

你应该这样做;

dr["TAX"] is DBNull ? string.Empty : dr["TAX"].ToString();
于 2013-11-04T13:13:39.343 回答
-1

您可能可以这样做:

StreetName = (dr["streetName"] + "")

如果它为空,这应该给你一个空字符串,如果不是,则给你来自数据库的字符串。

于 2013-11-04T13:12:27.790 回答