OdbcDataReader.GetBoolean()抛出强制转换的奇怪问题是bool列的无效异常

时间:2009-07-17 10:22:19

标签: c# postgresql odbc

好的,这个让我完全疯了。我在PostgreSQL数据库中有一个表,我试图使用OdbcDataReader.GetBoolean(int col)获取特定记录的布尔列值。

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

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

我完全没有想法。

3 个答案:

答案 0 :(得分: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(“位”字段类型)。

答案 1 :(得分: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);

显然,列顺序与它有关。

答案 2 :(得分: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;