2009-07-17 71 views
0

好吧,这一个是让我完全疯了。我在PostgreSQL数据库中有一个表,我试图用OdbcDataReader.GetBoolean(int col)获取特定记录的布尔值列。奇怪的问题与OdbcDataReader.GetBoolean()投掷演员是无效的例外布尔列

问题是GetBoolean()一直抛出一个强制转换是无效的异常,即使相同的代码在几天前工作。更奇怪的是相同的代码在另一种形式下工作正常。

从我的应用程序的以前的工作版本所做的唯一更改是在表中添加一列。也就是说,我需要的列的索引没有改变。噢,获取GetValue()的值,然后在结果上调用GetType()将返回System.String,并将true/false值转换为1/0。

我完全没有想法。

回答

0

虽然我仍然不知道是什么原因造成这个异常,我已经成功地拿出的作品(从我的应用程序而不是实际的代码)代码:

val1 = reader.GetInt32(0); 
val2 = reader.GetBoolean(4); 
val3 = reader.GetBoolean(8); 

然而,这并不:

val3 = reader.GetBoolean(8); 
val1 = reader.GetInt32(0); // causes invalid cast exception 
val2 = reader.GetBoolean(4); 

显然,列顺序与它有关。

0

我不认为将System.String传递给GetBoolean()会为你工作 - 正如你从异常中看到的那样,你会得到一个InvalidCastException,这意味着它在内部的某个地方试图做类似这个:

string s = "true"; 
bool b = (bool)s; 

这显然不起作用。

如果你可以看到ODBC传递给你一个System.String,那么你想要使用Convert.ToBoolean(),bool.TryParse()或bool.Parse,这取决于与其余部分完全相符的东西的代码。

至于为什么它工作,现在不是 - 有人将数据库字段上的基础数据类型更改为基于字符的类型?

这种模式就是我们用来获取布尔数据出OdbcDataReader的:

data.Gender = reader["Gender"] == DBNull.Value ? 
    false : Convert.ToBoolean(reader["Gender"]); 

费力,是的。但它对我们很好。此代码的底层数据库是Access(“是/否”字段类型)或MS SQL Server(“位”字段类型)。

+0

感谢您的答复。该列绝对是布尔类型的。在它上面调用reader.GetDataTypeName()会返回“bool”,但是任何尝试从GetBoolean()中检索值都会产生很好的异常。此外,就像我说的,完全相同的调用在应用程序的其他地方也可以使用。 – dandan78 2009-07-17 12:04:06

+0

嗯..那很奇怪。完全相同的SQL语句? – tomfanning 2009-07-17 12:23:45

0

我碰到了同样的问题,它实际上是由于无效的转换,我在我调用SP ...

在存储的过程

declare @colA INT -- should have been a float!!! 
set @colA = select someValue from someTable 

select @someVar, someColumn 
from someOtherTable 

//the line below works, even though it should have the SQL datatype is FLOAT 
_someVar = reader[2] != DBNull.Value ? reader.GetDouble[2] : 0; 
    //the following line blows up w/invalid cast exception, even though it is correct 
_someColumn = reader[3] != DBNull.Value ? reader.GetBoolean[3] : false;