DataSet オブジェクト内のリモートの日付と時刻値が別のタイム ゾーン内にあるリモート コンピューターの同等のローカル時刻に変換します。

文書翻訳 文書翻訳
文書番号: 842545 - 対象製品
すべて展開する | すべて折りたたむ

目次

概要

渡すと、DataSet クラスのオブジェクトまたは Web サービスをリモート Web サービスを が、タイム ゾーンとは、呼び出し元のアプリケーションのタイム ゾーンとは異なる、含まれているテーブル内の日付と時刻列は同等のローカル時刻に変換されます。 日付と時刻の列は、System.Data.DataSet コードは、リモート コンピューターのタイム ゾーンに従って同等のローカル時刻に調整されますので、変換されます。 たとえば、5時 00分の値を渡した場合 (太平洋標準時のクライアント コンピューターから Web サービスに東部標準時で、Web サービスの受信側メソッドで 8時 00分に、DataSet オブジェクトの値が変更します。 ここでは、Web サービスにクライアント アプリケーションからのタイム ゾーン情報を渡すと、リモート コンピューターで、日付と時刻の列を調整して、この問題を回避する方法について説明します。 System.Data は DataSet class. を含む名前空間

現象

日付と時刻の列の値は、Web サービスまたはリモート Web サービスに、 System.Data.DataSet オブジェクトを渡すときを変更します。 この問題は、Web サービスまたはリモートの Web サービスが、クライアント アプリケーションよりも、別のタイム ゾーン場合に発生します。 日付と時刻の列に値が、リモート コンピューターのタイム ゾーンに従って同等のローカル時刻に変換します。

原因

クライアント アプリケーションのタイム ゾーンは、 DataSet オブジェクトのシリアル化中に格納されます。 DataSet オブジェクトは、受信側で逆シリアル化し、 System.Data.DataSet コード別のタイム ゾーン内にあるリモート コンピューターの同等のローカル時刻に日付と時刻列の調整します。

回避策

DataSet オブジェクトは、クライアント アプリケーションで作成され、リモート コンピューター上で呼び出されたプロセスで受信した後、 DataSet オブジェクトを調整する必要がありますしときに、タイム ゾーンに関する情報を渡すと、この問題を回避する必要があります。 これを行うには、次の手順を実行します。
  1. リモート コンピューター上で Web サービス プロジェクト、クライアント アプリケーションのタイム ゾーンに従って、 日付と時刻 値を調整するコード記述します。 これを行うには、次の手順を実行します。
    1. 次のコードで、 Service1 追加、Web サービスを作成する」で指定されたクラス:
      [WebMethod]
      public string AdjustDSTimeZone( DataSet dataSet ) 
      {
      
       // Obtains the time difference on the sender computer that
       //remoted this dataset to the Web service.
       string str;	
       string sourceTicksString = dataSet.ExtendedProperties["UTCDifference"].ToString();
       long sourceTicks = long.Parse( sourceTicksString );
       // Obtain the UTC offset for the remote computer.
       DateTime baseUTC = DateTime.Now;
       long UtcTickslocal = TimeZone.CurrentTimeZone.GetUtcOffset( baseUTC ).Ticks;
       // Obtain the time difference between the sender computer and the remote computer.
       long ticksDifference = sourceTicks - UtcTickslocal;
       TimeSpan timespan = new TimeSpan( ticksDifference );
       
       // The following code iterates through each table, and find all the columns that are 
       // DateTime columns. After identifying the columns that have to be adjusted,
       // it traverses the data in the table and adjusts the DateTime columns back to their 
       // original values. You must leave the RowState of the DataRow in the same state 
       //after making the adjustments.
       foreach( DataTable table in dataSet.Tables ) 
       {
        DataColumnCollection columns = table.Columns;
        int[] ColumnNumbers = new int[columns.Count];
        int   ColumnNumbersIndex = 0;
        for( int i = 0; i < columns.Count; i++ ) 
        {
         DataColumn col = columns[i];
         if ( col.DataType == typeof( DateTime ) ) 
         {	
       	ColumnNumbers[ColumnNumbersIndex] = i;
      	ColumnNumbersIndex++;
         }
       }
       foreach( DataRow row in table.Rows ) 
       {
        switch ( row.RowState ) 
        {
         case DataRowState.Unchanged:
          AdjustDateTimeValues( row, ColumnNumbers,
          ColumnNumbersIndex, timespan );
          row.AcceptChanges();	// This is to make sure that the
          // row appears to be unchanged again.
          Debug.Assert( row.RowState == DataRowState.Unchanged );
          break;
         case DataRowState.Added:
          AdjustDateTimeValues( row, ColumnNumbers, ColumnNumbersIndex, timespan );
          // The row is still in a DataRowState.Added state.
          Debug.Assert( row.RowState == DataRowState.Added );
           break;
         case DataRowState.Modified:
           AdjustDateTimeValues( row, ColumnNumbers, ColumnNumbersIndex, timespan );
          // The row is a still DataRowState.Modified.
          Debug.Assert( row.RowState == DataRowState.Modified );
          break;
         case DataRowState.Deleted:
          //   This is to make sure that you obtain the right results if 
          //the .RejectChanges()method is called.
          row.RejectChanges();	// This is to "undo" the delete.
          AdjustDateTimeValues( row, ColumnNumbers, ColumnNumbersIndex, timespan );	
          // To adjust the datatime values.
          // The row is now in DataRowState.Modified state.
          Debug.Assert( row.RowState == DataRowState.Modified );
          row.AcceptChanges();	// This is to mark the changes as permanent.
          Debug.Assert( row.RowState == DataRowState.Unchanged );
          row.Delete();			
          // Delete the row. Now, it has the same state as it started.
          Debug.Assert( row.RowState == DataRowState.Deleted );
          break;
          default:
          throw new ApplicationException
          ( "You must add a case statement that handles the new version of the dataset." );
         }
        }
       } 
       str=dataSet.Tables["MyTable"].Rows[0][1].ToString() ; 
       return str;
      }
      
      AdjustDSTimeZone メソッド、クライアント アプリケーションの元の時刻を反映する 日付と時刻 値を調整します。 ここで、 ExtendedProperties は、 DataSet クラスのプロパティを DataSet オブジェクトに世界協定時刻 (UTC) のオフセットを格納する使用します。 ExtendedProperties プロパティと、 DataSet オブジェクトにカスタム情報格納できます。 DataSet オブジェクトをリモートに </a0> の場合は、UTC オフセット ExtendedProperties 内の文字列として格納する必要がありますコレクション。
    2. AdjustDSTimeZone 下に次のコードを追加メソッド:
      void AdjustDateTimeValues( DataRow row, int[] ColumnNumbers, int columnCount, TimeSpan timespan) 
      {
        for ( int i = 0; i < columnCount; i++ ) 
        {
      	int columnIndex = ColumnNumbers[i];
      	DateTime original = (DateTime)row[columnIndex];
      	DateTime modifiedDateTime = original.Add(timespan);
      	row[columnIndex] = modifiedDateTime;
        }
      }
    3. メニューの ファイル ] をクリックして すべて保存 をアプリケーションを保存します。
    4. [ ビルド ] の [アプリケーションをビルドする ソリューションのビルド ] をクリックします。
    AdjustDateTimeValues メソッドは、調整、 日付と時刻 オブジェクトを使用します。 特定の行の日付と時刻] 列から、元の時刻を取得し、クライアント アプリケーションのローカル時刻にに従って変更します。
  2. クライアント アプリケーションで、Web サービスは、タイム ゾーン情報を調整することを確認するコード記述します。 これを行うには、次の手順を実行します。
    1. 次のコード、 メイン の追加、クライアント アプリケーションを作成する」で指定されているコードの後の関数:
      str=myDatasetService.AdjustDSTimeZone(myDataset );
      Console.WriteLine (str);
      Console.ReadLine ();
    2. ソリューション エクスプローラー] ですべてのフォルダーを展開します。
    3. WebReference1 ] を右クリックし、 Web 参照の更新 を実行します。
    4. メニューの ファイル ] をクリックして すべて保存 をアプリケーションを保存します。
    5. [ ビルド ] の [アプリケーションをビルドする ソリューションのビルド ] をクリックします。
    6. [ デバッグ ] の [ 開始 のアプリケーションを実行する] をクリックします。
クライアント アプリケーションは、日付と時刻の列を含む MyTable テーブルに接続します。 Web サービスのオブジェクトを作成し、Web の AdjustDSTimeZone メソッドに DataSet クラスのオブジェクトを渡しますがサービス。 Web サービスで AdjustDSTimeZone メソッドは、の日付と時刻を更新するし返します、クライアント アプリケーションのタイム ゾーンにに従っての MyTable の表は、の最初の行の日付と時刻の値の列、MyTable のテーブルします。 クライアント アプリケーションによって受信される 日付と時刻 値は、クライアント アプリケーションを Web に渡される値と同じサービス。

状況

これは仕様によるものです。

詳細

この問題を再現する手順

データベース テーブルを作成します。

SQL のインスタンスでデータベース テーブルを作成するサーバー、次の手順を実行します。
  1. SQL クエリ アナライザーを起動します。
  2. [ ファイル ] メニューの [ 新規作成 を] をクリックします。
  3. 新しいクエリ] ウィンドウ ] をクリックし、 [OK] を実行します。
  4. クエリ ウィンドウに次のコードを貼り付けます。 次のコード作成 MyTable テーブル
    CREATE  TABLE MyTable (
    
                [ID] [int] NOT NULL ,
    
                [DateTimeCol] [datetime] NOT NULL 
    
    ) ON [PRIMARY]
    
    Go
    Insert into MyTable Values (1, '2004-05-19 15:00:00.000')
    Go
    
    Insert into MyTable Values (2, '2004-05-19 13:00:00.000')
    Go
    
    
  5. [ クエリ ] メニューの [ 実行 クエリを実行する] をクリックします。 MyTable テーブルが作成され、テーブルは 2 つの値で更新されます。

Web サービスを作成します。

クライアント アプリケーションからの 日付と時刻 の値を受け取るリモート コンピューターで、Web サービス プロジェクトを作成します。 これを行うには、次の手順を実行します。
  1. Microsoft Visual Studio .NET を開始します。
  2. [ ファイル ] メニューの [ 新規作成 ] をポイントし、[ プロジェクト ] をクリックします。
  3. [ プロジェクトの種類 ] で [ Visual C# プロジェクト ] をクリックし、 ASP.NET Web サービス [ テンプレート ] ボックスの一覧の [。
  4. [ 名前 ] ボックスで MyWebService 、入力を [OK] をクリックします。 既定では、Service1.asmx ファイルが作成されます。
  5. ソリューション エクスプローラーで、 Service1.asmx ファイルを右クリックし、 [コードの表示
  6. 次のコード ファイルの先頭に追加:
    using System.Data.SqlClient;
    using System.Timers;
  7. 次のコードで、 Service1 見つけますクラス:
    public class Service1 : System.Web.Services.WebService
    {
  8. 次のコード手順 7 にあるコードの後に追加:
    [WebMethod]
    public String DataSetReturn( DataSet clientDataSet )
    {
      string str;				
      str=clientDataSet.Tables["MyTable"].Rows[0][1].ToString() ;
      return str;	
    }
    DataSetReturn メソッドは、クライアント アプリケーションによって渡される データセット のオブジェクトを受け取ります。 このメソッドは、クライアント アプリケーションに、MyTable テーブルの最初の行の 日付と時刻 の値を返します。
  9. メニューの ファイル ] をクリックして すべて保存 をアプリケーションを保存します。
  10. ダイアログ ボックスで [ ビルド ] をクリックして ビルド ソリューション アプリケーションをビルドします。

クライアント アプリケーションを作成します。

DataSet オブジェクトをリモート Web サービスに渡されるクライアント アプリケーションを作成するには、次の手順に従います。
  1. Microsoft Visual Studio .NET を開始します。
  2. [ ファイル ] メニューの [ 新規作成 ] をポイントし、[ プロジェクト ] をクリックします。
  3. [ プロジェクトの種類 ] で [ Visual C# プロジェクト ] をクリックし、 コンソール アプリケーション [ テンプレート ] ボックスの一覧の [。
  4. [ 名前 ] ボックスで MyDataSet 、入力を [OK] をクリックします。 既定では、Class1.cs ファイルが作成されます。
  5. 次のコード ファイルの先頭に追加:
    using System.Data;
    using System.Data.SqlClient;
    using System.Timers;
    using System.Diagnostics;
  6. 次のコードで、 メイン 追加関数:
    string auth="Server=YourServer;Database=YourDatabase;User ID=YourUserID;password=YourPassword";
    WebReference1.Service1 myDatasetService = new WebReference1.Service1();
    DataSet myDataset = new DataSet();
    SqlDataAdapter da = new SqlDataAdapter("Select * From MyTable",auth);
    da.Fill(myDataset, "MyTable");
    //Modify first row to have the current time.
    myDataset.Tables["MyTable"].Rows[0][1] = DateTime.Now;
    string str=myDataset.Tables["MyTable"].Rows[0][1].ToString() ;
    System.Console.WriteLine(str);
    //Store the ticks from UTC in the ExtendedProperties collection of the DataSet
    DateTime clientDateTime = DateTime.Now;
    myDataset.ExtendedProperties["UTCDifference"] = TimeZone.CurrentTimeZone.GetUtcOffset
    ( clientDateTime ).Ticks.ToString();    
    str= myDatasetService.DataSetReturn(myDataset );
    Console.WriteLine (str);
    Console.ReadLine ();
    
    メモ MyTable にアクセスするにはテーブルをする必要がありますと変更する、サーバーの情報、ユーザー名とパスワード、Microsoft SQL Server との接続を確立すると、データベース情報。
  7. ソリューション エクスプローラーで 参照設定 ] を右クリックし、[ Web 参照の追加 ] をクリックします。
  8. [ URL ] ボックスに、"http://"RemoteServer/MyWebService/Service1.asmx を入力し、[ 移動 しています。 既定では、Visual Studio .NET 2002、WebReference1 という名前の参照が作成する Web。

    メモ RemoteServer は、Web サービスが作成される、リモート サーバーの名前のプレースホルダーです。
  9. Microsoft Visual Studio .NET 2003 を WebReference1 Web 参照名 を入力] ボックス。 ここで WebReference1 をコードの構文の一致を使用します。
  10. 参照の追加 クリックします。
  11. メニューの ファイル ] をクリックして すべて保存 をアプリケーションを保存します。
  12. ダイアログ ボックスで [ ビルド ] をクリックして ビルド ソリューション アプリケーションをビルドします。
  13. [ デバッグ ] の [ 開始 のアプリケーションを実行する] をクリックします。
クライアント アプリケーションは、最初の行の日付と時刻列に、変更します。 コードを現在の日付と、クライアント アプリケーションの時刻に 日付と時刻 の値を設定します。 DataSet オブジェクトを Web サービスに渡します。 Web サービスでは、 DataSet オブジェクトを受け取る、最初の行から日付と時刻の列の値を取得し、クライアント アプリケーションに返す値を返します。 指定されている、「現象」として、リモート サーバーのタイム ゾーン情報にに従って、Web サービスによって返される 日付と時刻 値は変更セクション。

.NET Framework リモート処理

アプリケーションで、.NET Framework リモート処理サービスを実装する、.NET Framework Web サービス メソッドを呼び出さない場合は、 DataSetSurrogate クラスのコードが使えます。DataSetSurrogate クラスの追加についてはをクリックして以下「サポート技術情報」(Microsoft Knowledge Base) 資料を参照。
829740データセットのシリアル化およびリモート処理のパフォーマンスを向上
DataSetSurrogate クラスは日付と時刻の列に、ローカル タイム ゾーンの調整を防止します。 このクラスは .NET Framework リモート処理中にパフォーマンスが向上も提供します。 DataSetSurrogate クラスは、 DataSet クラスの既定のシリアル化をオーバーライドし、 DataSetSurrogate クラスとそのバイナリ形式で含まれているメンバーをシリアル化します。

関連情報

詳細については、次のマイクロソフトの開発者用ネットワーク (MSDN) の Web サイトを参照してください。
System.Data.SqlClient 名前空間
http://msdn2.microsoft.com/en-us/library/system.data.sqlclient(vs.71).aspx
DataSet.ExtendedProperties プロパティ
http://msdn2.microsoft.com/en-us/library/system.data.dataset.extendedproperties(vs.71).aspx

プロパティ

文書番号: 842545 - 最終更新日: 2007年5月18日 - リビジョン: 1.5
この資料は以下の製品について記述したものです。
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0
キーワード:?
kbtshoot kbremoting kbsqlclient kbsystemdata kbservice kbprb kbclient kbwebservices kbmt KB842545 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:842545
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com