2009-08-26 47 views
5

我需要從一個SQL服務器獲取一個位到C#。我嘗試了不同的解決方案,如:從SqlServer獲取一點到C#

bool active = rdr.GetSqlBinary(5); 
Int16 active = rdr.GetSqlBinary(5); 

但找不到任何方式獲取該位。 有人可以舉個例子嗎?

+0

在一個側面說明,你可以讓你的代碼更可讀/維護使用GetOrdinal(),例如:rdr.GetSqlBoolean(RDR .GetOrdinal(「MyBitColumn」)) – grenade 2009-08-26 14:30:39

+0

我也試過: bool active = rdr.GetSqlBoolean(12); 我得到的結果:不能將SqlBoolean轉換爲布爾 – Jorn 2009-08-26 14:40:35

+0

嗨,你錯過了一個演員,請看下面我的答案。 – James 2009-08-26 14:45:11

回答

12

如果你確信列值永遠不會NULL那麼下面會做的伎倆:

bool active = rdr.GetBoolean(rdr.GetOrdinal("Active")); 

如果這是可能的NULL值可能會被返回:

int oActive = rdr.GetOrdinal("Active"); 
bool? active = rdr.IsDBNull(oActive) ? (bool?)null : rdr.GetBoolean(oActive); 
4

使用GetSqlBoolean方法。

更新

確保你投你的返回值作爲一個布爾即

var active = (bool)rdr.GetSqlBoolean(5); 
+0

如果你打算downvote請說明爲什麼?沒有理由在沒有理由的情況下downvote答案... – James 2009-08-26 14:48:25

+3

'SqlBoolean'實際上只是一個布爾值的包裝函數,以允許爲空等。所以,如果你打算調用'GetSqlBoolean',然後立即將結果轉換爲'bool',你可能只需要首先調用'rdr.GetBoolean'。 – LukeH 2009-08-26 15:29:38

0

使用GetFieldType確定要使用的數據類型。

0

我得出了以下的解決方案使用:

bool active = (bool)rdr.GetSqlBoolean(rdr.GetOrdinal("Active")); 
+0

你不應該需要使用GetOrdinal,GetSqlBoolean應該是足夠的。他們都有相同的返回類型... – James 2009-08-26 14:49:58

+0

你不能在StackOverflow上註冊,直到你有15 ...?聲望點,你通過自己上升獲得獎勵,選擇答案和徽章。不過,我認爲你應該能夠將特定的答案標記爲選定的答案。 – 2009-08-26 15:08:36

+0

'SqlBoolean'實際上只是一個包含布爾值的包裝函數,以允許爲空等。所以,如果你要調用'GetSqlBoolean',然後立即將結果轉換爲'bool',你可能只需調用'rdr.GetBoolean'首先。 – LukeH 2009-08-26 15:34:34

0

有一個SqlBoolean結構的公共get方法:IsTrue。所以,你可以使用這種方式,以確保結果是布爾值:

bool active = rdr.GetSqlBoolean(5).IsTrue;