好的,这个让我完全疯了。我在PostgreSQL数据库中有一个表,我试图使用OdbcDataReader.GetBoolean(int col)获取特定记录的布尔列值。
问题是GetBoolean()不断抛出强制转换是无效的异常,即使几天前相同的代码工作。更奇怪的是,相同的代码在另一种形式下工作正常。
我的应用程序的上一个工作版本所做的唯一更改是向表中添加一列。也就是说,我需要的列的索引没有改变。哦,是的,使用GetValue()获取值,然后在结果上调用GetType()返回System.String,并将true / false值转换为1/0。
我完全没有想法。
答案 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;