2012-02-03 70 views
1

在C#中使用OdbcDataReader,我有一个查询返回一个可能包含空值的整数列。为什么在检查空值后从OdbcDataReader读取值时会出现InvalidCastException?

对于每一行,我想测试该值是否为null并对其进行适当处理。但是,当我使用IsDBNull执行此操作时,即使对于非空行,也会得到InvalidCastException。为什么会发生?

如果省略IsDBNull检查,我只会收到包含空值的行的错误。

OdbcConnection DbConnection = new OdbcConnection("DSN=..."); 
DbConnection.Open(); 
OdbcCommand DbCommand = DbConnection.CreateCommand(); 
DbCommand.CommandText = @" 
         select 1 as result from dual 
         union 
         select null as result from dual"; 
OdbcDataReader DbReader = DbCommand.ExecuteReader(); 
Int32 result; 
while (DbReader.Read()) 
{ 
    if (!DbReader.IsDBNull(0)) 
    { 
     result = DbReader.GetInt32(0); // Results in InvalidCastException 
    } 
    else 
    { 
     result = 0; 
    } 
    Console.WriteLine(Convert.ToString(result)); 
} 

Console.ReadLine(); 

编辑:

下面的技术检查空似乎工作。我想知道为什么上述不通过。

object resultObject = DbReader.GetValue(0); 
if (resultObject != DBNull.Value) 
{ 
    result = Convert.ToInt32(resultObject); 
} 
else 
{ 
    result = 0; 
} 
+0

这是什么异常的确切消息转换为Int32处理呢? – 2012-02-03 12:18:11

+0

System.InvalidCastException未处理 消息=指定的转换无效。 – 2012-02-03 12:24:04

+0

在你的工作技巧编辑中,你改变了**两件事情。你无法从空值检查中推断任何事情。只需更改空值检查或获取价值的方式,而不是两者。 – 2012-02-03 12:26:37

回答

4

这很可能是因为值不是Int32类型而发生的。

您可以制定出字段类型与DbReader.GetFieldType(0);

或者,您可以通过它与Convert.ToInt32(DbReader.GetValue(0));

相关问题