2011-05-09 73 views
13

在C#中,使用SqlDataReader,有沒有辦法從數據庫讀取布爾值?從數據庫讀取布爾值?

while (reader.Read()) 
{ 
    destPath = reader["destination_path"].ToString(); 
    destFile = reader["destination_file"].ToString(); 
    createDir = reader["create_directory"].ToString(); 
    deleteExisting = Convert.ToBoolean(reader["delete_existing"]); 
    skipIFolderDate = reader["skipifolderdate"].ToString(); 
    useTempFile = reader["useTempFile"].ToString(); 
    password = reader["password"].ToString(); 
} 

在上面的代碼中,delete_existing在數據庫中始終爲1或0。我在MSDN上讀到Convert.ToBoolean()不接受1或0作爲有效輸入。它只接受真或假。有沒有另一種方法將DB值轉換爲bool?或者我需要在SqlDataReader之外執行此操作嗎?

另外,我無法更改DB值,因此請不要回答說:「將DB值從1和0改爲true和false」。

謝謝!

回答

34

如果delete_existing類型是SQLSERVER '位' 類型,你可以這樣做:

var i = reader.GetOrdinal("delete_existing"); // Get the field position 
deleteExisting = reader.GetBoolean(i); 

或(但它會崩潰,如果delete_existing可以DBNull

deleteExisting = (bool)reader["delete_existing"]; 

或更好,這一個下面是DBNull證明並返回如果列是DBNull

deleteExisting = reader["delete_existing"] as bool? ?? false; 

否則,如果數據庫類型是int

deleteExisting = (reader["delete_existing"] as int? == 1) ? true : false; 

,或者如果它是一個varchar

deleteExisting = (reader["delete_existing"] as string == "1") ? true : false; 
+0

@Laurent嗯...我寧願選擇第三種選擇,因爲有人可以在桌子上添加一列,然後很明顯,應用程序會崩潰。但是,你能解釋第二個選項到底發生了什麼嗎?我被「作爲布爾?錯誤的」弄糊塗了。「特別是3?的... – 2011-05-09 19:56:57

+0

第三種解決方案:我試圖將讀者[「delete_existing」]投給一個可爲空的bool(bool?)。這樣,如果字段包含DBNull.Value,則強制轉換將失敗並返回null。因爲我寧願變得錯誤,我正在使用?它將null轉換爲任何值(即:null ?? 45 = 45)。我使用了很多。 – Larry 2011-05-09 20:02:51

+0

第二種解決方案:我正在對bool進行直接投射。如果該值不是布爾類型,這個將會拋出異常。例如,如果它是DBNull.Value。這就是爲什麼它應該與非空位數據庫字段一起使用。只需選擇一個適合您的需求^^ delete_existing btw的數據庫類型是什麼? – Larry 2011-05-09 20:08:13

-1
deleteExisting = reader.GetBoolean(reader["delete_existing"]); 
+0

這個語句返回一個錯誤。我認爲這是因爲GetBoolean函數希望傳入一個Int,並且reader [「delete_existing」]不是int ... – 2011-05-09 19:59:18

+0

嘗試轉換它嗎?它應該自動轉換爲一個int我相信,但你可以嘗試明確做reader.GetBoolean((int)reader [「delete_existing」]); – slandau 2011-05-09 20:00:41

+0

對不起,在GetBoolean(x)中,x不是要轉換爲bool的值,而是一個整數,它是要在數據讀取器中讀取的字段的位置。 – Larry 2011-05-09 20:04:00

3

鑄造工程: myVar的=(布爾)的DataReader [ 「myColumn」] ;

+4

如果返回的值實際上是有點的話,那就行了。如果某人懶惰地選擇了1或0作爲整數,那麼投射將失敗。 – canon 2011-05-09 20:00:08

1

這個怎麼樣?

deleteExisting = (reader["delete_existing"] as int?) == 1; 

布爾可能是一些easist類型轉換的東西。這裏的「Y」,「N」版本:

deleteExisting = string.Equals(reader["delete_existing"] as string, "Y", StringComparision.OrdinalIgnoreCase); 
+0

這是一個不錯的 – Larry 2011-05-09 20:20:27

1

如果您正在使用SELECT CASE,並希望使用GetBoolean然後使用CAST閱讀前更改列位。

對於如:

SELECT CAST((CASE WHEN [Condition] THEN 1 ELSE 0 END) as bit) FROM Table_Name 

那麼你可以使用

reader.GetBoolean(0)