我正在尝试使用我的查询返回的列表填充组合框。当我执行我的程序时,它给我一个指定的强制转换无效错误(我在页面加载事件上执行)。除了主键之外,我必须使用的数据库中的每个字段都可以为null。所以我尝试使用DBNull.Value但它无法使我的(int)阅读器字段起作用。我已提供下面的代码以便更好地理解。如何让我的(int)读者使用我的语句,以便在有空值时可以阅读?
CustData cd = new CustData();
cd.CustomerID = (int)reader["CustomerID"];
cd.Name = reader["Name"] != DBNull.Value ? reader["Name"].ToString() : string.Empty;
cd.ShippingAddress = reader["ShippingAddress"] != DBNull.Value ? reader["ShippingAddress"].ToString() : string.Empty;
cd.ShippingCity = reader["ShippingCity"] != DBNull.Value ? reader["ShippingCity"].ToString() : string.Empty;
cd.ShippingState = reader["ShippingState"] != DBNull.Value ? reader["ShippingState"].ToString() : string.Empty;
cd.ShippingZip = (int)reader["ShippingZip"];
cd.BillingAddress = reader["BillingAddress"] != DBNull.Value ? reader["BillingAddress"].ToString() : string.Empty;
cd.BillingCity = reader["BillingCity"] != DBNull.Value ? reader["BillingCity"].ToString() : string.Empty;
cd.BillingState = reader["BillingState"] != DBNull.Value ? reader["BillingState"].ToString() : string.Empty;
cd.BillingZip = (int)reader["BillingZip"];
cd.Territory = reader["Territory"] != DBNull.Value ? reader["Territory"].ToString() : string.Empty;
cd.Category = reader["Category"] != DBNull.Value ? reader["Category"].ToString() : string.Emptyy
答案 0 :(得分:5)
这是因为int
不可为空。您需要使用int?
或nullable<int>
(长手)来允许它为int或null值。
然后,您可以使用通常的.HasValue
和.Value
等来获取该项目的值。
编辑:提高我对此答案的评论的可见性。我建议不要检查NULL并将Zero存储到您的属性中,因为当您保存回来时,即使系统没有更改任何内容,您也会将Null更改为零。现在,报告等可以区分NULL和Zero(经常)并且可以开始做奇怪的事情!
Null不等于零!!如果你认为它是作为一种解决方法...如果我真的想记录零会怎么样?你如何区分真零和“现在为零”的伎俩?做得对,救你自己的痛苦!
答案 1 :(得分:2)
使用nullable int,或者只是对你的int进行控制
reader["ShippingZip"] != DBNull.Value ? (int)reader["ShippingZip"] : default(int);
答案 2 :(得分:1)
你应该为你的变量使用一个可空的int并将其转换为(int?)
。 Int
只能有一个值;可空类型也可以为null。使用可空类型时,可以查看属性.HasValue
。这是MSDN页面:http://msdn.microsoft.com/en-us/library/2cf62fcy.aspx