2010-08-06 35 views
7

Tôi đã xác định Lớp Người tài sản Ngày sinhnullable DateTime?, vậy tại sao không phải toán tử kết hợp không hoạt động trong ví dụ sau?C# ?? null câu hỏi điều hành coalescing

cmd.Parameters.Add(new SqlParameter("@Birthday", 
    SqlDbType.SmallDateTime)).Value =  
    person.Birthday ?? DBNull.Value; 

Lỗi trình biên dịch tôi nhận là "Toán tử '??' không thể áp dụng cho các toán hạng kiểu 'System.DateTime?' và 'System.DBNull"

Sau đây cũng có một lỗi biên dịch:

cmd.Parameters.Add(new SqlParameter("@Birthday", 
    SqlDbType.SmallDateTime)).Value = 
    (person.Birthday == null) ? person.Birthday:DBNull.Value; 

tôi đã thêm một dàn diễn viên đến (object) theo khuyến cáo của Refactor, và nó được biên dịch, nhưng không hoạt động đúng và giá trị được lưu trữ trong sqlserver db là null trong cả hai trường hợp.

SqlDbType.SmallDateTime)).Value =  
     person.Birthday ?? (object)DBNull.Value; 

Ai đó có thể giải thích những gì đang diễn ra ở đây?

tôi cần phải sử dụng mã vụng về như sau:

if (person.Birthday == null) 
    cmd.Parameters.Add("@Birthday", SqlDbType.SmallDateTime).Value 
     = DBNull.Value; 
    else cmd.Parameters.Add("@Birthday", SqlDbType.SmallDateTime).Value = 
      person.Birthday; 
+3

Bản sao của http://stackoverflow.com/questions/218808/c-ado-net-nulls-and-dbnull-is-there-more-efficient-syntax – sgriffinusa

+0

Có được điều này từ bài đăng khác: SqlDbType.SmallDateTime)) .Value = person.Birthday ?? (đối tượng) DBNull.Value; Cảm ơn! –

Trả lời

20

Vấn đề là DateTime?DBNull.Value không cùng loại nên bạn không thể sử dụng toán tử coalescing null trên chúng.

Trong trường hợp của bạn, bạn có thể làm person.Birthday ?? (object)DBNull.Value để vượt qua một giá trị kiểu object qua để Add()

3

vấn đề đầu tiên của bạn là đối với các nhà điều hành ?? hoặc ?:, các đối tượng cho một trong hai lựa chọn phải có cùng loại. Ở đây chúng là loại khác nhau.

+1

Vì vậy, những gì hiện '?:' Làm gì? chỉnh sửa: nevermind, tôi biết rằng, chỉ cần không bao giờ nhìn thấy những biểu tượng 2 đặt lại với nhau như thế trước đây. http://msdn.microsoft.com/en-us/library/ty67wk28.aspx –

3

tôi thích để lặp qua các thông số của tôi ngay trước khi thực hiện truy vấn, thay đổi tất cả các trường hợp null để DBNull khi thích hợp, ví dụ:

foreach (IDataParameter param in cmd.Parameters) 
    if (param.Value == null) 
     param.Value = DBNull.Value; 

này cho phép tôi rời giá trị null như-là và chỉ cần trao đổi chúng ra ngoài sau.

+0

Với tôi đây là câu trả lời rõ ràng và đơn giản, tốt. –

+0

Vấn đề của tôi với điều này là thêm chi phí của việc lặp qua các tham số sau khi thực tế, so với xử lý chúng ngay lập tức. – Andrew