2012-11-25 20 views
9

Tôi có hai đối tượng DateTime, Ngày sinh và Ngày thuê. Chúng được định dạng chính xác như một chuỗi và khi tôi chuyển chúng qua lớp truy cập dữ liệu của chúng, chúng cần được phân tích cú pháp thành đối tượng DateTime.Cách quản lý việc phân tích đối tượng null cho DateTime được sử dụng với ADO.NET là DBNULL

DateTime hD = DateTime.Parse(hire);    
DateTime bD = DateTime.Parse(birth); 

//incase of a datestring being passed through 
dateStringPassed = "7/2/1969"; 

Nhưng đôi khi, những chuỗi hirebirth là null hoặc rỗng "", nếu mã được chạy như thế này, tôi nhận được một lỗi FormatException từ Phân tích một chuỗi rỗng. Làm cách nào tôi có thể quản lý các phân tích trống và cho phép DateTime, nếu trống hoặc không, được chấp nhận là DBNull.Value?

Tôi vẫn không thể quản lý trong trường hợp người dùng không vượt qua chuỗi DateTime, sau đó phân tích cú pháp làm hỏng mã của tôi.

Thông số của tôi cho ngày sinh như sau và kiểm tra biến nếu null, sau đó sử dụng DBNull.Value.

Trả lời

2

Bạn cần sử dụng nullable ngày giờ - cú pháp phím tắt sẽ là DateTime? (lưu ý ? ở cuối).

DateTime? hD = null; 
if(!string.IsNullOrWhitespace(hire)) // string.IsNullOrEmpty if on .NET pre 4.0 
{ 
    hD = DateTime.Parse(hire);    
} 

Bạn có thể kiểm tra cho hD.HasValue và nếu nó không sử dụng DbNull.Value để thay thế.

+0

Bạn có thể viết ví dụ với DateTime bD = DateTime.Parse (birth)? Sẽ sử dụng một '?' Tại công việc cuối cùng cũng cho một 'int'? – GivenPie

+0

@GivenPie - Có, nó sẽ cho một 'int' và bất kỳ loại giá trị nào. – Oded

+0

Tuyệt vời, cảm ơn Oded! – GivenPie

9

Phương pháp Parse không thể xử lý chuỗi rỗng, nhưng bạn có thể sử dụng DateTime nullable và làm điều gì đó như thế này:

DateTime? hD = String.IsNullOrEmpty(hire) ? (DateTime?)null : DateTime.Parse(hire) 

Nhưng ngay cả an toàn hơn sẽ được sử dụng thay vì TryParse:

DateTime? hD = null; 
DateTime.TryParse(hire, out hD); 

Sau đó, để lưu trữ giá trị này, bạn có thể kiểm tra hD.HasValue:

if(hD.HasValue) { /* use hD */ } 
else { /* else use DBNull.Value */ } 

Kể từ C# 7, bạn có thể sử dụng cú pháp ngắn cho inline ra các thông số và bạn có thể tránh loại nullable hoàn toàn:

if (DateTime.TryParse(hire, out var hD)) { /* use hD */ } 
else { /* use DBNull.Value */ } 
+1

Tôi tin rằng bạn sẽ phải bỏ' null' trong toán tử bậc ba đó để có được dòng đó để biên dịch. Cả hai bên của ':' cần phải có cùng loại hoặc kiểu có chuyển đổi tiềm ẩn giữa chúng. – Oded

+0

Bạn nói đúng, tôi sẽ sửa câu trả lời của tôi. –

+1

Và dòng cuối cùng - tôi không thấy cách bạn có thể truyền như vậy trình biên dịch có thể chấp nhận nó. – Oded

0

Nếu bạn sử dụng phương pháp này, bất cứ điều gì đó không phải là một ngày tháng chính xác sẽ trả về một DBNull.Value:

/// <summary> 
/// Parses a date string and returns 
/// a DateTime if it is a valid date, 
/// if not returns DBNull.Value 
/// </summary> 
/// <param name="date">Date string</param> 
/// <returns>DateTime or DBNull.Value</returns> 
public static object CreateDBDateTime(string date) 
{ 
    DateTime result; 
    if (DateTime.TryParse(date, out result)) 
    { 
     return result; 
    } 
    return DBNull.Value; 
} 
Các vấn đề liên quan