7

次のような方法で、SQLからデータを読み取り、WCF経由でクライアントアプリに送信するアプリケーションがあります。

SqlDataAdapter da = new SqlDataAdapter( cmd )
DataSet ds = new DataSet();
da.Fill( ds );
return ds;

すべての日付/時刻はUTCとしてデータベースに保存されます。私が気付いたのは、アプリケーションを実行しているコンピューターの時計が歪んでいると、クライアントが受信する日付/時刻も歪んでしまうということです。DateTimeタイプが指定されていない場合、WCFはそれを内部で現地時間として表し、そのように送信するようです。そのため、アプリケーションとクライアントの時間差により、日付/時刻がシフトします。

データセットが取得されて日付/時刻フィールドが修正されるので、確かにデータセットを調べることができますが、すべてのDateTimeフィールドがda.Fill()で自動的にDateTimeKind.Utcになるように、データセットを埋めるより良い方法を考えている人はいますか?

4

2 に答える 2

18

SQL Server 2008を使用している場合、「適切な」解決策はdatetimeoffset、SQLの日時の代わりにSQLデータ型を使用することです。 はタイムゾーン対応の日付/時刻タイプであり、SQL 2008の新機能であり、ADO.NETで常にUTCを基準とdatetimeoffsetするCLRタイプに変換されます。これについての詳細を説明System.DateTimeOffsetするブログ投稿があります。追加の背景情報を提供するためのMSDNの最初のいくつかの検索結果。DateTimeOffset

SQLスキーマを変更できない場合、ADO.NETには、この状況に合わせてカスタムメイドのプロパティがあります。これDataColumn.DateTimeModeは、データセットのシリアル化時にローカルタイムゾーンを追加するか(DateTimeMode=DataSetDateTime.UnspecifiedLocalデフォルト)、タイムゾーン情報を追加しないかを制御します。シリアル化について(DateTimeMode=DataSetDateTime.Unspecified)。後者が必要です。

私のMSDNドキュメントの読み方が正しければ、DataSetが入力された後、問題の問題DateTimeMode=DataSetDateTime.Unspecifiedに設定できるはずです。DataColumnこれにより、タイムゾーンなしで列がシリアル化されます。

本当に適切になりたい場合(または上記のアプローチが機能しない場合)は、事前に作成し、DataTableその列を行で設定するDateTimeMode=DataSetDateTime.Utc前に設定できます。Fillその後、UTCとして日付を送信することが保証されます。

于 2009-11-11T06:11:06.383 に答える
0

私の場合、関連する列のDateTimeModeプロパティ値をXSDスキーマのデフォルト値「UnspecialedLocal」ではなく「Unspecialed」に変更します。

于 2019-02-22T01:19:51.293 に答える