C# OdbcDataReader存在奇怪的问题。GetBoolean()引发的强制转换对于bool列无效

C# OdbcDataReader存在奇怪的问题。GetBoolean()引发的强制转换对于bool列无效,c#,postgresql,odbc,C#,Postgresql,Odbc,好吧,这件事让我发疯了。我在PostgreSQL数据库中有一个表,我正在尝试使用OdbcDataReader.GetBoolean(int col)为特定记录获取布尔列的值 问题是GetBoolean()不断抛出cast is not valid异常,即使几天前相同的代码还在工作。更奇怪的是,同样的代码在另一种形式下运行良好 从我的应用程序的上一个工作版本所做的唯一更改是向表中添加一列。也就是说,我需要的列的索引没有更改。哦,是的,使用GetValue()获取值,然后对结果调用GetType()

好吧,这件事让我发疯了。我在PostgreSQL数据库中有一个表,我正在尝试使用OdbcDataReader.GetBoolean(int col)为特定记录获取布尔列的值

问题是GetBoolean()不断抛出cast is not valid异常,即使几天前相同的代码还在工作。更奇怪的是,同样的代码在另一种形式下运行良好

从我的应用程序的上一个工作版本所做的唯一更改是向表中添加一列。也就是说,我需要的列的索引没有更改。哦,是的,使用GetValue()获取值,然后对结果调用GetType(),将返回System.String和true/false值转换为1/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(“位”字段类型)。

虽然我仍然不知道导致此异常的原因,但我已设法找到了有效的代码(不是我应用程序中的实际代码):

然而,这并不意味着:

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

显然,列顺序与此有关。

我遇到了相同的问题,实际上是因为我在调用的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;

谢谢你的回复。该列绝对是布尔类型。对其调用reader.GetDataTypeName()会返回“bool”,但使用GetBoolean()从中检索值的任何尝试都会产生一个很好的异常。此外,正如我所说,完全相同的调用在应用程序中的其他地方也适用。。这很奇怪。完全相同的SQL语句?嗯,SQL并不完全相同,但这两个语句都从同一个表返回*并且只在where子句上有所不同。我的意思是GetBoolean()在一个地方工作,但在另一个地方不工作。我不相信您遇到的问题与我的问题完全相同。在我的例子中,我直接从表中检索数据,根据对GetBoolean()的调用在代码中的位置,我得到了无效的强制转换异常。
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;