Tôi có một số DateTime?
mà tôi đang cố gắng chèn vào một trường bằng cách sử dụng DbParameter
. Tôi đang tạo ra các thông số như sau:C# ADO.NET: nulls và DbNull - có cú pháp hiệu quả hơn không?
DbParameter datePrm = updateStmt.CreateParameter();
datePrm.ParameterName = "@change_date";
Và sau đó tôi muốn đặt giá trị của DateTime?
vào dataPrm.Value
khi chiếm null
s.
tôi nghĩ ban đầu tôi muốn được thông minh:
datePrm.Value = nullableDate ?? DBNull.Value;
nhưng điều đó không thành công với các lỗi
Operator '??' không thể áp dụng cho các toán hạng kiểu 'System.DateTime?' và 'System.DBNull'
Vì vậy, tôi đoán rằng chỉ hoạt động nếu đối số thứ hai là phiên bản không thể vô hiệu của đối số đầu tiên. Vì vậy, sau đó tôi đi cho:
datePrm.Value = nullableDate.HasValue ? nullableDate.Value : DBNull.Value;
nhưng điều đó không làm việc, hoặc:
Loại biểu thức điều kiện không xác định được vì không có chuyển đổi ngầm giữa 'System.DateTime' và 'System. DBNull '
Nhưng tôi không muốn chuyển đổi giữa các loại đó!
Cho đến nay điều duy nhất tôi có thể nhận được để làm việc là:
if (nullableDate.HasValue)
datePrm.Value = nullableDate.Value;
else
datePrm.Value = DBNull.Value;
Đó là thực sự là cách duy nhất tôi có thể viết này? Có cách nào để có được một lớp lót bằng cách sử dụng toán tử ternary để hoạt động không?
Cập nhật: Tôi thực sự không hiểu tại sao ?? phiên bản không hoạt động. MSDN nói:
?? toán tử trả về toán hạng bên trái nếu nó không phải là null, nếu không nó sẽ trả về toán hạng bên phải.
Đó chính xác là những gì tôi muốn!
Update2: Vâng đó là loại rõ ràng cuối cùng:
datePrm.Value = nullableDate ?? (object)DBNull.Value;
http://stackoverflow.com/questions/1545711/is-it-possible-to-coalesce-string-and- dbnull-in-c – JohnB