当我的网站获得以下代码时,它会出现如下例外情况:
System.InvalidCastException:无法将对象从DBNull强制转换为其他类型。
为了简洁起见,我只显示相关代码(这是我给出的4000+ LOC文件)。
if (dr["STAGE"] is DBNull)
{
dto.Stage = 1; // This is the line throwing the exception, according to stack trace
}
else
{
dto.Stage = Convert.ToInt32(dr["STAGE"]);
}
这里,dr
是一个DataRow对象,它是对数据库进行查询的结果,dto
是一个基本类,只保存一些属性,其中dto.Stage
是{ {1}}成员。
我已经查看了其他问题,并显示了相同的错误消息,但大多数似乎都建议“检查它是否为DBNull”,我已经在做了。
那么有人可以提出解决方案吗?
答案 0 :(得分:4)
使用==
代替is
if (dr["STAGE"] == DBNull.Value)
{
}
答案 1 :(得分:2)
使用这种稍微更有效的方法
int stageOrdinal = dr.GetOrdinal("STAGE");
while (dr.Read()) {
dto = new DataTransferObject();
if (dr.IsDBNull(stageOrdinal)) {
dto.Stage = 1;
} else {
dto.Stage = dr.GetInt32(stageOrdinal);
}
//TODO: retrieve other columns.
dtoList.Add(dto);
}
按索引访问列比按名称访问列更快。可以使用GetOrdinal
的{{1}}方法检索列的索引。这最好在循环之前完成。
答案 2 :(得分:1)
请改用System.Data.DataRow.IsNull功能。
if(dr.IsNull("Stage"))
{
...
}
答案 3 :(得分:0)
以下是可以为空的数据类型的示例,您可以使用它来避免DBNull错误。 以下示例不是您所遇问题的真正解决方案,而是您如何解决问题的一个示例。把它想象成学习捕鱼,而不是给鱼。
我从http://msdn.microsoft.com/en-us/library/1t3y8s4s.aspx
取出了这个class NullableExample
{
static void Main()
{
int? num = null;
if (num.HasValue == true)
{
System.Console.WriteLine("num = " + num.Value);
}
else
{
System.Console.WriteLine("num = Null");
}
// y is set to zero
int y = num.GetValueOrDefault();
// num.Value throws an InvalidOperationException if num.HasValue is false
try
{
y = num.Value;
}
catch (System.InvalidOperationException e)
{
System.Console.WriteLine(e.Message);
}
}
}
答案 4 :(得分:0)
@MarcGravell在评论中有权利:
<@> @谢尔盖的回答是完全错误的。忽略堆栈跟踪中的确切行号;数字可以 稍微偏离 - 我一直都在看。在调试器中运行它 换句话说,或者只是在钉住它时添加额外的日志记录