Linq-to-SQL 和 DateTime 的怪異
我們在這裡對Linq-to-SQL有非常奇怪和不一致的行為。
我們的應用程序安裝在很多客戶的站點上,並且在大多數情況下執行良好。Linq-to-SQL 中的一個查詢更新表並將
DateTime列設置為新值。在所有情況下——包括我們的開發和測試系統——這個 Linq-to-SQL 語句都被翻譯成以下內容:
UPDATE dbo.OurTable SET WorkTimeStamp = @WTS WHERE ID = @ID @WTS = '2011-11-04 14:15:25', @ID = 555但是,在一個客戶的站點上,由於我們(目前)尚不清楚的原因,此更新被翻譯為:
UPDATE dbo.OurTable SET WorkTimeStamp = @WTS WHERE ID = @ID @WTS = 'Nov 4 2011 02:15:25PM', @ID = 555然後由於某種原因在SQL Server 2005上失敗。
現在,該客戶的伺服器(Web 伺服器和 SQL Server)安裝了美國英語版本的 Windows Server 2008;SQL Server 中的語言設置為
us_english,日期格式設置為mdy,執行更新的使用者帳戶的語言設置為EnglishSQL Server ….. 並且該設置在其他地方是相同的(例如,在我們的測試伺服器上基礎設施)。所以我的問題真的是:
- 為什麼Linq-to-SQL 會突然創建一個完全不同的表示
DateTime來發送到 SQL Server?有沒有旋鈕可以控制這個?- 為什麼 ADO.NET 和 SQL Server 2005 SP2 數據庫不能
UPDATE正確處理該語句?我們的日誌中出現錯誤,內容如下:SqlTypeException - SqlDateTime 溢出。必須介於 1753 年 1 月 1 日上午 12:00:00 和 9999 年 12 月 31 日晚上 11:59:59 之間。
這似乎是一個 .NET 錯誤(不僅僅是 SQL Server 錯誤),而且似乎 .NET 由於某種原因無法真正將其解釋
Nov 4 2011 02:15:25PM為有效DateTime。當嘗試在SQL Server Management Studio中執行生成的 UPDATE 語句時,我們似乎無法“強制”該錯誤發生 -UPDATE愉快地工作得很好……**更新:**一些進一步的調查似乎表明 Linq-to-SQL 在針對 SQL Server 2005 或 2008 時的行為有所不同。
- 使用 SQL Server 2005,我們的日期變成:
Nov 4 2011 02:15:25PM- 使用 SQL Server 2008,我們的日期變成:
2011-11-04 02:15:25PM
我想你可能追錯了問題。
我會先檢查:
- 您的LINQ to SQL模式/數據庫模型是準確的。
- 您的問題邏輯,以確保新的 DateTime 值不會超出範圍。特別是,檢查它不能是
DateTime.MinValueor 或DateTime.MaxValue。- 你沒有在你的應用程序中做任何字元串到日期解析。
- SQL Server 沒有任何觸發器(特別是沒有觸發器,它可能正在修改更新語句)。
我猜你(或你的客戶)從得到 ‘SqlTypeException - SqlDateTime 溢出開始。必須介於 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之間”錯誤消息,在調查後您注意到日期顯示方式的差異。
你沒有提到資訊來自哪裡,所以我假設像 SQL 探查器這樣的東西。
然而,日期顯示問題可能是一個紅鯡魚,因為它不應該是一個問題。
使用 SQL Server 2005,我們的日期變為:2011 年 11 月 4 日 02:15:25PM
使用 SQL Server 2008,我們的日期變成:2011-11-04 02:15:25PM
我不確定你的意思是什麼。SQL 不會將日期“轉換”為字元串,因為它不會將日期儲存為字元串,但內部表示是一個數字(類似於自 1900 年 1 月 1 日以來的天數)。
如果您的意思是您的日期顯示為 Nov 4 2011 02:15:25PM,那麼這取決於顯示資訊的程序。
另外,據我了解,如果您使用的是 DateTime 參數(如果數據庫模型準確,則 LINQ to SQL 應該這樣做),那麼從客戶端發送到 SQL Server 的資訊是 SQL 數字表示約會時間。這應該避免客戶端和伺服器之間的任何日期時間轉換問題。例如,當您查看 SQL Profiler 時,它不會向您顯示日期的數字表示,這對大多數人來說意義不大,但會盡力提供幫助並將值顯示為字元串。
重要的一點是,如果 SQL 或 SQL 分析器設法將日期時間參數顯示為“2011 年 11 月 4 日 02:15:25PM”,那麼它就知道這是一個有效的日期,並且它確切地知道那是什麼日期。
所以我懷疑顯示格式問題可能無關緊要。
然後留下一個問題,為什麼您的客戶會收到 SqlTypeException - SqlDateTime 溢出錯誤消息。
首先要做的是檢查您設置的日期值,這需要在應用程序級別完成,而不是在 SQL Server 伺服器上完成,因為它不會達到那麼遠。(這是我認為這不是 SQL 配置問題的另一個原因。)
由於某種原因,.NET 似乎無法真正將 2011 年 11 月 4 日 02:15:25PM 解釋為有效的 DateTime
除非您有一些命令,否則我看不出.NET會在哪裡嘗試將字元串解釋為日期
DateTime.Parse,如果是這種情況,那麼問題與 LINQ 或 SQL 無關。