簡體   English   中英

OdbcDataReader.GetBoolean()引發轉換的奇怪問題不是布爾列的有效異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM