2010-05-06 88 views
3

這真讓我困惑。這裏是我的模型的一個片段:使用LINQtoSQL超出範圍日期時間問題

* SQL Server * 

Event 
----- 
Id (int, PK) NOT NULL 
Title (varchar(100)) NULL 
LastModified (datetime) NULL 

EventDates 
---------- 
Id (int, PK) NOT NULL 
StartDate (datetime) NULL 
EndDate (datetime) NULL 

* C# * 

Event 
----- 
public int Id 
public string Title 
public DateTime LastModified 

EventDates 
---------- 
public int Id 
public DateTime StartDate 
public Datetime EndDate 

LastModified領域一直處於自其創建數據庫。我一直保存它的值當我保存的事件,但我想在一個表中顯示它,所以我改變了我的事件庫的GetEvents的返回值:

return (from e in GetDbEvents() 
       select new Event 
       { 
        // Miscellaneous fields.. 
        LastModified = e.LastModified.GetValueOrDefault() // Shiny new code 
       }); 

現在當我打電話,我得到在大叫:

The conversion of a char data type to a datetime data type 
resulted in an out-of-range datetime value. 

如果我剝離下來,上面的代碼這一點,但它仍然沒有幫助,我也得到了同樣的錯誤,如果我試圖枚舉結果:

var test = (from e in _db.Events 
        select e.LastModified.GetValueOrDefault()); 

作爲測試,我做同樣的語句我EventDates表(再次,與2 datetime列):

var test4 = (from ed in _db.EventDates 
        select new EventDate 
        { 
         StartDate = ed.StartDate.GetValueOrDefault(), 
         EndDate = ed.EndDate.GetValueOrDefault() 
        }); 

這工作得很好,當然。列舉時沒有錯誤,所有的值都是正確的。

我應該指出Events表中的一些LastModified值是NULL,而EventDates中的所有值都填充了數據。

我錯過了一些基本的東西嗎?提前致謝!

編輯 我的主要問題是爲什麼Events給我超出範圍的問題,EventDates沒有,即使模型頗爲相似?

+0

什麼是最小值和最大值(即MIN()和MAX())值的每個表格列中你正在檢查? – 2010-05-06 14:40:02

回答

3

的問題是與GetValueOrDefault()。這將在「默認」情況下返回DateTime.MinValue(01-01-0001),並且sqlserver不接受(它在1753之前拒絕日期)。

如果你使用的是Nullable<DateTime>,那麼sql會很滿意它會得到的null

0

如果將您的C#變量LastModified的聲明更改爲public DateTime? LastModified,那麼應該修復您的問題。問號的添加表明它是可以爲空的類型。

+0

我會給你一個鏡頭。然而,我的主要問題是 - Events如何解決這個問題,而不是EventDates?謝謝! – Dan 2010-05-06 14:18:46

1

也許this是相關的?

一個可能的修復(如果你不想上次更改時間更改爲DateTime?,需要你垃圾你的代碼.Value無處不在..)將獲得從數據庫中值DateTime?的,但翻譯他們到DateTime在你的代碼中。例如:

return from e in GetDbEvents() 
     select new Event(e.LastModified); 

... 

//In Event class: 
public Event(DateTime? lastModified) 
{ 
    LastModified = lastModified.GetValueOrDefault(); 
} 

這將導致GetValueOrDefault()被稱爲客戶端,而不是在SQL的一部分。

注意,這種方法確實有problems of its own ...

+0

感謝您的鏈接!我喜歡這個錯誤是一個'無法修復' - 它爲我的「升級到2008年」戰鬥提供了更多的彈藥:P – Dan 2010-05-06 14:53:08