2010-01-13 24 views
7

Tôi có dòng mã sau đâyLàm thế nào có thể DBNull không DBNull bằng

if (DBNull.Value.Equals(o) || o != null) 

nơi oobject o in row.ItemArray tôi tiếp tục nhận được một lỗi của ->

Xml type "List of xdt:untypedAtomic" does not support a conversion from Clr type "DBNull" to Clr type "String".

Những gì tôi làm không hiểu rằng khi tôi bước qua mã của tôi, if này sẽ bắt được điều này và thực hiện hành động thay thế của tôi nhưng nó không?

Ai đó có thể làm sáng tỏ một số ánh sáng cho tôi.

Cảm ơn bạn!

+0

bạn có thể đăng thêm một số mã không? nơi nào o được giao? – hackerhasid

+1

Kết quả của 'Console.WriteLine (o.GetType(). Name);' là gì? – jason

+2

tôi nghĩ rằng đó là một chút lạ đầu tiên bạn so sánh với DBNull và sau đó với không null – tga

Trả lời

1

có thể so sánh như vậy giúp

if (!o.GetType().Equals(DBNull.Value))

hoặc

if (o is DBNull)

6

Tôi nghĩ rằng bạn vấn đề là trên thực tế

DBNull.Value == null 
//is always false 

Các DBNull là một lớp học đặc biệt để so sánh về giá trị trở về từ các dB để bạn thực sự cần phải kiểm tra một điều kiện null và một DBNull.value nếu mảng của bạn có chứa cả hai.

CHỈNH SỬA: Xin lỗi nhìn kỹ vào mã của bạn, bạn có thể chỉ cần đảo ngược hoạt động OR của bạn. Nếu o == null, câu lệnh đầu tiên của bạn sẽ phát sinh với ngoại lệ của bạn. Hãy thử:

if (o != null || o == DBNull.Value) 
+1

không nếu o == null ... –

+0

chỉnh sửa này là sai, với nó làm một thử nghiệm đối diện chính xác về những gì có nghĩa là. Do trạng thái @ThomasLevesque đúng, nó cần phải là 'if (o == null || o == DBNull.Value)' thay thế. Nhưng tuyên bố đầu tiên cũng không phải là một vấn đề, nhưng phong cách đó dẫn đến vấn đề của nhiều lỗi mã hóa, nơi nó sẽ ném ngoại lệ khi đối tượng là null. vì vậy nó là * rất * tốt để luôn luôn kiểm tra null hoặc không null * đầu tiên *, trước khi làm bất cứ điều gì khác với giá trị. –

+1

lỗi mà 'thổi lên mã' là khi bạn thử một cái gì đó như 'if (o.ToString()) {...}' bởi vì sau đó khi o là null, bất kỳ * thuộc tính * hoặc các hàm phương thức như '.ToString() 'sẽ ném một lỗi. vì vậy nó luôn luôn là thực hành tốt để đảm bảo để kiểm tra cho null hay không null đầu tiên. Tuy nhiên 'if (DBNull.Value.Equals (o) || o! = Null)' không truy cập bất kỳ thuộc tính nào của o. Và nếu phương thức xử lý một giá trị null một cách chính xác, thì không có lỗi khi o là null. Nhưng các lập trình viên MANY quên kiểm tra null, vì vậy việc truyền null sang MANY thường gây ra nhiều vấn đề bởi vì, thành thật mà nói, rất nhiều mã là cẩu thả. –

Các vấn đề liên quan