Asp.net

Linq-to-SQL 和 DateTime 的怪異

  • September 30, 2012

我們在這裡對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 ….. 並且該設置在其他地方是相同的(例如,在我們的測試伺服器上基礎設施)。

所以我的問題真的是:

  1. 為什麼Linq-to-SQL 會突然創建一個完全不同的表示DateTime來發送到 SQL Server?有沒有旋鈕可以控制這個?
  2. 為什麼 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

我想你可能追錯了問題。

我會先檢查:

  1. 您的LINQ to SQL模式/數據庫模型是準確的。
  2. 您的問題邏輯,以確保新的 DateTime 值不會超出範圍。特別是,檢查它不能是DateTime.MinValueor 或DateTime.MaxValue
  3. 你沒有在你的應用程序中做任何字元串到日期解析。
  4. 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 無關。

引用自:https://stackoverflow.com/questions/8010507