C# の DateTime 文字列が不思議なことに英国の日付 (dd/MM/yyyy) としてフォーマットされているため、SQL DateTime への変換に失敗するという問題があります。一連のイベントは次のとおりです。
- 米国のリモート サーバーでオブジェクトが作成され、xml にシリアル化されます。
- xml は、CA のローカル コンピューターで逆シリアル化され、オブジェクトに戻されます。シリアル化された日付は次のようになります: 2011-07-13T09:56:57.0542425
- アプリケーションは、前述のストアド プロシージャを呼び出して、オブジェクトをデータベースに保存しようとします。Convert.ToString(DateTime) を使用して、日付をパラメーターとして sproc に渡す前に、(不必要に) 日付を文字列に変換します。
- sproc は SqlException "Error conversion data type nvarchar to datetime" で失敗します。これは、DateTime 型付きパラメーターに対して受け取った文字列が dd/MM/yyyy 形式であったためです (データベース言語は米国英語です)。
さて、コードは日時を文字列に変換してSQLで日時に戻すだけではいけませんが、1年以上すべてがうまくいった後、この問題が(複数のコンピューターで)発生し始めました。そのため、DB または OS の文化が最近変更され、異なる日付形式が使用されているに違いないと思いました。驚いたことに、OS (Windows 7) を英語 (カナダ) から英語 (米国) に変更して再起動した後も、問題は引き続き発生します。さらに紛らわしいことに、地域設定に関係なく、同じタイプのオブジェクトが逆シリアル化されるのではなくローカルで作成された場合、エラーは発生しません。唯一の違いは、シリアル化バージョンが Windows サービスで発生し、ローカルで作成されたオブジェクト バージョンが Windows アプリで発生することです。どちらも Convert.ToString(DateTime) を呼び出すアセンブリの独自のコピーを使用しますが、そのアセンブリの同じバージョンを使用しています。私は完全に混乱しています。
PS .NET 2.0 & SQL Server 2005