2009-07-17 28 views
0

好吧,這一個是讓我完全瘋了。我在PostgreSQL數據庫中有一個表,我試圖用OdbcDataReader.GetBoolean(int col)獲取特定記錄的布爾值列。奇怪的問題與OdbcDataReader.GetBoolean()投擲演員是無效的例外布爾列

問題是GetBoolean()一直拋出一個強制轉換是無效的異常,即使相同的代碼在幾天前工作。更奇怪的是相同的代碼在另一種形式下工作正常。

從我的應用程序的以前的工作版本所做的唯一更改是在表中添加一列。也就是說,我需要的列的索引沒有改變。噢,獲取GetValue()的值,然後在結果上調用GetType()將返回System.String,並將true/false值轉換爲1/0。

我完全沒有想法。

回答

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); 

顯然,列順序與它有關。

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(「位」字段類型)。

+0

感謝您的答覆。該列絕對是布爾類型的。在它上面調用reader.GetDataTypeName()會返回「bool」,但是任何嘗試從GetBoolean()中檢索值都會產生很好的異常。此外,就像我說的,完全相同的調用在應用程序的其他地方也可以使用。 – dandan78 2009-07-17 12:04:06

+0

嗯..那很奇怪。完全相同的SQL語句? – tomfanning 2009-07-17 12:23:45

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;