2010-08-03 6 views
9

tôi có một ứng dụng được viết cho năm 2008.Lỗi - SqlDateTime tràn. Phải từ 1/1/1753 12:00:00 AM và 12/31/9999 11:59:59 PM

Chúng tôi đang sử dụng LINQ cho các thực thể.

Bây giờ chúng ta đã phải chuyển DB với năm 2005. Tôi nhận được lỗi sau trên LINQ CHỌN truy vấn:

Lỗi - SqlDateTime tràn. Phải từ 1/1/1753 12:00:00 AM và 12/31/9999 11:59:59 PM.

Dòng vi phạm là:

DateOfBirth = ((s.Date_Of_Birth == null) || (s.Date_Of_Birth <= lowdate)) ? 
    DateTime.MinValue : s.Date_Of_Birth.Value, 

DateOfBirth là loại DateTime và một tài sản trong đối tượng kinh doanh riêng của chúng tôi (không tổ chức).

Bất kỳ ai biết cách tôi có thể sửa đổi dòng này để làm cho truy vấn này chạy?

+0

"lowdate" là gì thiết lập để? –

+0

bạn đã đặt sql profiler trên nó để xem SQL thực sự đang chạy là gì? – BlackICE

Trả lời

1

Điều này thường xảy ra khi bạn cố gắng để tồn tại DateTime.MinValue đến một lĩnh vực SQL DateTime

+1

Tôi cũng nghĩ như vậy, nhưng anh ấy đang tìm nạp, chứ không phải tiết kiệm. –

+0

@Kirk Woll: đây là thời gian tìm nạp (vì ngày tháng sau năm 1753) nhưng có thể lưu trữ giá trị nhỏ như trong DataTime.MinValue; –

13

Hãy chắc chắn rằng lowdate là ít nhất 1753/01/01.

Nếu bạn cố gắng cung cấp ngày trước đó, EF sẽ chuyển đổi và chuyển nó vào truy vấn của bạn. Ngoài ra, bạn cần phải không sử dụng DateTime.MinValue trong truy vấn, mà là những gì sẽ là min của bạn:

DateOfBirth = ((s.Date_Of_Birth == null) || (s.Date_Of_Birth <= lowdate)) ? 
    new DateTime(1753,1,1) : s.Date_Of_Birth.Value; 

Hãy nhớ rằng, với EF, truy vấn được biên soạn và chuyển đổi sang SQL trên máy chủ, vì vậy các giá trị phải tất cả cũng thích hợp ở đó.

Điều đó đang được nói, cá nhân tôi muốn lưu trữ DateOfBirthDateTime? (loại có thể thay thế) thay vì sử dụng "giá trị ma thuật" (DateTime.MinValue) để giữ các giá trị null hoặc không hợp lệ của cơ sở dữ liệu.

+1

+1 để sử dụng loại không có giá trị. –

1

Chắc chắn, thay thế DateTime.MinValue với "1753/01/01 00:00:00"

3

Các DateTime.MinValue tương đương với 00:00:00.0000000, January 1, 0001.

Và DateTime trong SQL 2005 là giữa 1753/01/01 12:00:00 và 11:59:59 12/31/9999 P

Thay vì sử dụng DateTime.MinValue, Bạn nên tạo một

public static DateTime DateTimeMinValueInSQL2005 = new DateTime(1753,1,1); 

và sử dụng thay thế DateTime.MinValue;

3

Hãy thử sử dụng (DateTime)SqlDateTime.MinValue thay vì:

DateOfBirth = ((s.Date_Of_Birth == null) || (s.Date_Of_Birth <= lowdate)) ? 
    (DateTime)SqlDateTime.MinValue : s.Date_Of_Birth.Value, 

Bạn sẽ cần phải bao gồm:

using System.Data.SqlTypes; 

Đó sẽ chăm sóc của vấn đề nếu bạn vẫn muốn sử dụng một trường ngày không null. Tuy nhiên, như những người khác đã đề cập, nó có thể là tốt hơn để đi với một trường ngày null.

1

tôi đã tạo ra một chức năng mở rộng cho việc này:

/// <summary> 
/// Will return null if the CLR datetime will not fit in an SQL datetime 
/// </summary> 
/// <param name="datetime"></param> 
/// <returns></returns> 
    public static DateTime? EnsureSQLSafe(this DateTime? datetime) 
    { 
     if (datetime.HasValue && (datetime.Value < (DateTime)SqlDateTime.MinValue || datetime.Value > (DateTime)SqlDateTime.MaxValue)) 
      return null; 

     return datetime; 
    }