2011-05-09 56 views
13

Trong C#, sử dụng SqlDataReader, có cách nào để đọc một giá trị boolean từ DB không?Đọc các giá trị boolean từ DB?

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

Trong mã ở trên, delete_existing luôn là 1 hoặc 0 trong DB. Tôi đọc trên MSDN rằng Convert.ToBoolean() không chấp nhận 1 hoặc 0 là đầu vào hợp lệ. Nó chỉ chấp nhận đúng hoặc sai. Có cách nào khác để chuyển đổi một giá trị DB thành một bool không? Hoặc tôi cần phải làm điều này bên ngoài của SqlDataReader?

Ngoài ra, tôi không thể thay đổi giá trị DB, vì vậy vui lòng không trả lời, "Thay đổi giá trị DB từ 1 và 0 thành giá trị true và false."

Cảm ơn!

Trả lời

34

Nếu loại delete_existing là một SQLServer 'chút' loại, bạn có thể làm:

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

hoặc (nhưng nó sẽ sụp đổ nếu delete_existing có thể DBNull)

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

hoặc tốt hơn, onebelow này là DBNull bằng chứng và trả về false nếu cột là DBNull

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

Nếu không, nếu loại cơ sở dữ liệu là int:

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

hoặc nếu nó là một Đúc varchar

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

@Laurent Hmm ...Tôi thà đi với lựa chọn thứ ba bởi vì ai đó có thể thêm một cột vào bảng và sau đó, rõ ràng, ứng dụng sẽ phá vỡ. Tuy nhiên, bạn có thể giải thích chính xác những gì đang xảy ra trong tùy chọn thứ hai không? Tôi bối rối bởi "như bool? ?? false;" cụ thể là 3? '... –

+0

Giải pháp thứ 3: Tôi đang cố gắng đọc trình đọc ["delete_existing"] thành một bool null (bool?). Bằng cách này, diễn viên thất bại và trả về null nếu trường có chứa DBNull.Value. Bởi vì tôi thích để có được sai thay vào đó, tôi đang sử dụng ?? mà biến đổi một giá trị null thành bất kỳ giá trị nào (ví dụ: null? 45 = 45). Tôi sử dụng rất nhiều. – Larry

+0

Giải pháp thứ hai: Tôi đang thực hiện dàn diễn viên trực tiếp với một bool. Điều này sẽ ném một ngoại lệ nếu giá trị không phải là một loại boolean. Ví dụ, nếu nó là DBNull.Value. Đó là lý do tại sao nó nên được sử dụng với trường không phải là cơ sở dữ liệu bit null. Chỉ cần chọn một trong những phù hợp với nhu cầu của bạn^^ Loại cơ sở dữ liệu của delete_existing btw là gì? – Larry

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

tuyên bố này trả về một lỗi. Tôi cho rằng đó là vì hàm GetBoolean muốn một Int được truyền vào, và đầu đọc ["delete_existing"] không phải là một int ... –

+0

Thử truyền nó? Nó sẽ tự động cast vào một int tôi tin nhưng bạn có thể thử một cách rõ ràng làm reader.GetBoolean ((int) đọc ["delete_existing"]); – slandau

+0

Tôi xin lỗi, trong GetBoolean (x), x không phải là một giá trị để chuyển đổi sang bool, mà là một số nguyên là vị trí của trường để đọc trong bộ dữ liệu. – Larry

3

hoạt động: myVar = (bool) DataReader [ "myColumn"] ;

+4

Điều đó hoạt động nếu giá trị trả lại thực sự là một chút. Nếu ai đó lười biếng chọn 1 hoặc 0 làm số nguyên mà diễn viên sẽ thất bại. – canon

1

Làm thế nào về điều này?

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

Boolean có lẽ là loại easist để chuyển đổi thứ gì đó thành. Đây là phiên bản 'Y', 'N':

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

Đây là một hình ảnh đẹp – Larry

1

Nếu bạn đang sử dụng CASE trong SELECT và muốn sử dụng GetBoolean thì sử dụng CAST để thay đổi cột thành bit trước khi đọc.

Đối với ví dụ:

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

sau đó bạn có thể sử dụng

reader.GetBoolean(0) 
Các vấn đề liên quan