15

ここではLinq-to-SQLと実際には奇妙で一貫性のない動作があります。Linq-to-SQLとDateTimeの奇妙さ

私たちのアプリケーションは、かなりの数の顧客のサイトにインストールされており、ほとんどの場合うまく動作します。 Linq-to-SQLのクエリの1つがテーブルを更新し、DateTime列を新しい値に設定します。上がらない理由のために、一人の顧客のサイトで、しかし

UPDATE dbo.OurTable 
SET WorkTimeStamp = @WTS 
WHERE ID = @ID 

@WTS = '2011-11-04 14:15:25', @ID = 555 

:すべてのケースで

- - 私たちの開発およびテストシステムなど、このLINQのツーSQLステートメントは、の線に沿って何かに翻訳されます「tは私たちに明確な(まだ)、この更新はに翻訳されます:

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に設定されており、そのセットアップは他の場所で同じです(たとえばon私たちのテストサーバーインフラストラクチャ)。

だから私の質問は本当にです:

  1. なぜ地球上のツーSQLのLINQが突然SQL Serverに送信するために同じDateTimeの全く異なる表現を作成しますか?これを制御するつまみはありますか?

  2. なぜ、ADO.NETとSQL Server 2005 SP2データベースは、そのUPDATEステートメントを正しく処理できないのですか? - SQLDATETIMEオーバーフロー

SqlTypeException:私達は私達の読み込みログにエラーを取得しています。 1/1/1753 12:00:00 AMと12/31/9999 11:59:59 PMの間である必要があります。

(SQL Serverエラーよりも).NETのエラーのようだと.NETは実際にいくつかの理由で有効なDateTimeように、そのNov 4 2011 02:15:25PMを解釈できないかのように思えます。 SQL Server Management Studioで生成されたUPDATEステートメントを実行しようとすると、我々は起こることそのエラーを「強制的」に見えることはできません - UPDATEは喜んでうまく動作します.....

更新:さらにいくつかの調査がLinq-を示しているようです-SQLは、SQL Server 2005またはSQL Serverと2008

  • 逆行は、私たちの日付がになって取得するときに異なる動作をします:SQL ServerとNov 4 2011 02:15:25PM
  • 日後、私たちの日付は次のように変わります:2011-11-04 02:15:25PM
+0

C#/ VB.NETアプリケーションのCurrentCulture設定を確認してください。 –

+0

@BogdanSahlean:すべてのシステムで 'CurrentCulture'が' InvariantCulture'に設定されています –

+0

これは.NETの問題であり、SQLではないことに同意します。おそらくLINQ2SQLの不具合はどこかで不変の文化を使うことを忘れています。 Windowsの場所の設定は一致していますか? – leppie

答えて

3

私はあなたが間違った問題を追いかけるかもしれないと思います。

私が最初に確認します:

  1. あなたのLINQ to SQLスキーマ/データベースモデルが正確です。
  2. 新しいDateTime値が範囲外になることがないようにするためのロジックは問題ありません。特に、DateTime.MinValueまたはDateTime.MaxValueのいずれにもなり得ないことを確認してください。
  3. アプリケーションで解析するために文字列を使用していないことを指定してください。
  4. SQL  サーバーにはトリガーがありません(特に、 トリガーの代わりに、更新ステートメントが変更されている可能性があります)。

「SqlTypeException - SqlDateTimeオーバーフロー」を取得することから、あなた(またはお客様)が推測しています。 1/1/1753 12:00:00 AMと12/31/9999 11:59:59 PMの間にある必要があります 'エラーメッセージと調査時に日付が表示される方法の違いに気づいた。

あなたは情報がどこから来ているか言及していないので、私はSQLプロファイラのようなものを想定しています。

ただし、日付表示の問題は問題ではないので、赤ちゃんになる可能性があります。 SQL Server 2005に

、私たちの日付はになってます:2011年11月4日午前2時15分25秒PM:SQL Server 2008に2011年11月4日午前2時15分25秒PM

、私たちの日付はになってます

あなたはそれが何を意味するか正確にはわかりません。 SQLはではありません。は日付を文字列として格納しないため、日付は文字列になりますが、内部表現は数字です(1900年1月1日以降の日数など)。

と表示された場合は、と表示され、2011年11月4日02:15:25 PMと表示されます。

また、データベースモデルが正確であればLINQ  〜  SQLが実行するはずのDateTimeパラメータを使用している場合、クライアントからSQL Serverに送信される情報は、 DateTimeのSQL数値表現これは、クライアントとサーバーの間のdatetime変換の問題を回避する必要があります。たとえば、SQLプロファイラーを見ると、日付の数値表現は表示されません。これはほとんどの人にはほとんど意味がありませんが、役立つようにして、その値を文字列として表示します。

重要な点は、SQLまたはSQLプロファイラでdatetimeパラメータを 'Nov 4 2011 02:15:25 PM'と表示すると、有効な日付であることがわかり、その日付が正確にわかります。

だから私は表示形式の問題はおそらく無関係だと思うでしょう。

これで、お客様がなぜSqlTypeException - SqlDateTimeオーバーフローエラーメッセージが表示されるのかという疑問が残ります。

最初に行うことは、設定している日付の値を確認することです。これは、アプリケーションレベルで実行する必要があり、SQL Serverサーバーでは実行できません。(これがSQLの構成上の問題ではない理由の1つです)。

.NETは何らかの理由で有効なDateTimeとして11月4 2011 02:15:25 PMを実際に解釈できないようです

.NETあなたには、いくつかのDateTime.Parseのコマンドを持っていない限り、日付などの文字列を解釈するを試みるだろうどこに表示されていないと、その場合は、その問題がLINQまたはSQLのいずれかとは何の関係もありません。

+0

(2)DateTimeは 'DateTime.Now.AddMinutes(5)'のように設定されているので、「範囲外」ではないと確信しています –

+0

彼は.NETが日付を文字列表現に変換してSQLが文字列に変換されるわけではありません。そして、.NETは2008年にSQL 2005の異なる日付形式の文字列を発行しており、形式が理解できないように見えるため、SQL 2005ではクエリが理解されていません。 –

+0

@marc_s私はそれがありそうもないと知っていますが、チャンスDateTime.Nowは範囲外かもしれません、つまり、コンピュータ/サーバーの日付が間違っていますか? – sgmoore