ここでは、 Linq-to-SQLで非常に奇妙で一貫性のない動作があります。
私たちのアプリケーションはかなりの数の顧客のサイトにインストールされており、ほとんどの部分で問題なく動作しています。Linq-to-SQL のクエリの 1 つは、テーブルを更新し、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
、更新を実行しているユーザー アカウントEnglish
は SQL Server で言語が に設定されており、その設定は他の場所 (たとえば、テスト サーバー) と同じです。インフラストラクチャー)。
だから私の質問は本当にです:
一体なぜ、 Linq-to-SQL は突然まったく異なる表現を作成し
DateTime
て SQL Server に送信するのでしょうか? これを制御するために回すノブはありますか?ADO.NET と SQL Server 2005 SP2 データベースがその
UPDATE
ステートメントを正しく処理できないのはなぜでしょうか? ログに次のようなエラーが表示されます。
SqlTypeException - SqlDateTime オーバーフロー。1753 年 1 月 1 日 12:00:00 AM から 9999 年 12 月 31 日 11:59:59 PM の間である必要があります。
.NET エラー (SQL Server エラー以上のもの) のようで、.NET が何らかの理由でそれNov 4 2011 02:15:25PM
を有効なものとして実際に解釈できないようです。生成された UPDATE ステートメントをSQL Server Management StudioDateTime
で実行しようとすると、そのエラーが発生することを「強制」できないようです。UPDATE
更新:さらに調査したところ、SQL Server 2005 または 2008 に対して実行すると、Linq-to-SQL の動作が異なることが示されているようです。
- SQL Server 2005では、日付は次のようになります。
Nov 4 2011 02:15:25PM
- SQL Server 2008では、日付は次のようになります。
2011-11-04 02:15:25PM