15

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

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

  1. 一体なぜ、 Linq-to-SQL は突然まったく異なる表現を作成しDateTimeて SQL Server に送信するのでしょうか? これを制御するために回すノブはありますか?

  2. 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
4

1 に答える 1

3

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

私は最初にチェックします:

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

'SqlTypeException-SqlDateTimeオーバーフローを取得することから始めて、あなた(またはあなたの顧客)を推測しています。1/1/175312:00:00AMと12/31/999911:59:59PMのエラーメッセージの間にある必要があります。調査したところ、日付の表示方法に違いがあることに気づきました。

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

ただし、日付表示の問題は問題ではないはずなので、問題になる可能性があります。

SQL Server 2005では、日付は次のようになります。2011年11月4日02:15:25 PM

SQL Server 2008では、日付は次のようになります:2011-11-04 02:15:25 PM

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

日付が2011年11月4日02:15:25PMとして表示されることを意味する場合、それは情報を表示しているプログラム次第です。

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

重要な点は、SQLまたはSQLプロファイラーが日時パラメーターを「2011年11月4日02:15:25 PM」として表示する場合、それが有効な日付であり、正確に日付であることがわかるということです。

したがって、表示形式の問題はおそらく無関係であると思われます。

次に、顧客がSqlTypeException-SqlDateTimeオーバーフローエラーメッセージを受け取る理由についての質問が残ります。

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

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

コマンドがない限り、 .NETが文字列を日付として解釈しようとしている場所がわかりません。DateTime.Parseその場合、問題はLINQまたはSQLとは関係ありません。

于 2011-11-05T16:05:58.183 に答える