[英]C# OdbcDataReader.GetBoolean InvalidCastException In IF-Statement
[英]weird problem with OdbcDataReader.GetBoolean() throwing cast is not valid exception for bool column
好的,这让我完全疯了。 我在PostgreSQL数据库中有一个表,并且正在尝试使用OdbcDataReader.GetBoolean(int col)为特定记录获取布尔列的值。
exception even though the same code worked just several days ago. 问题在于,即使同一代码几天前才起作用,GetBoolean()仍会抛出强制转换异常。 甚至更奇怪的是,同一代码在另一种形式下也可以正常工作。
对我的应用程序的先前工作版本所做的唯一更改是在表中添加了一个列。 就是说,我需要的列的索引没有改变。 哦,是的,使用GetValue()获取值,然后在结果上调用GetType()会返回System.String,并且true / false值将转换为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);
显然,列顺序与此有关。
我认为将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(“ bit”字段类型)。
我遇到了同样的问题,这实际上是由于我正在调用的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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.