DataSet 개체 원격 DateTime 값이 서로 다른 표준 시간대에 있는 원격 컴퓨터로 해당하는 현지 시간으로 변환됩니다.

기술 자료 번역 기술 자료 번역
기술 자료: 842545 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

이 페이지에서

요약

호출 응용 프로그램의 표준 시간대를 다른 표준 시간대에 사용하면 DataSet 클래스의 개체를 원격 웹 서비스 또는 웹 서비스에 전달할 때 , DateTime 열이 포함된 테이블에 해당하는 로컬 시간으로 변환됩니다. 원격 컴퓨터의 표준 시간대를 따라 해당하는 현지 시간을 System.Data.DataSet 코드 조정하여 때문에 DateTime 열로 변환됩니다. 예를 들어, 값 5시 태평양 클라이언트 컴퓨터에서 웹 서비스에 동부 표준시로 전달되는 경우, 웹 서비스의 수신 중인 메서드에는 8시 [NULL]로 DataSet 개체에서 값을 변경합니다. 이 문서에서는 이 문제를 해결하려면 웹 서비스 클라이언트 응용 프로그램에서 표준 시간대 정보를 전달하여 및 원격 컴퓨터에서 DateTime 열을 조정하여 작업 방법에 대해 설명합니다. DataSet class. 포함하는 네임스페이스, System.Data.

현상

웹 서비스 또는 원격 웹 서비스를 System.Data.DataSet 개체를 전달할 때 DateTime 열의 값을 변경합니다. 웹 서비스 또는 원격 웹 서비스 클라이언트 응용 프로그램이 아닌 다른 표준 시간대에 있는 경우 이 문제가 발생합니다. DateTime 열에 있는 값은 원격 컴퓨터의 표준 시간대를 따라 해당하는 로컬 시간으로 변환됩니다.

원인

클라이언트 응용 프로그램의 표준 시간대는 DataSet 개체를 serialize하는 동안 저장됩니다. 수신 끝에 DataSet 개체를 역직렬화할 System.Data.DataSet 코드 DateTime 열을 서로 다른 표준 시간대에 있는 원격 컴퓨터에 동일한 로컬 시간을 조정합니다.

해결 과정

이 문제를 해결하려면 DataSet 개체는 클라이언트 응용 프로그램에서 만든 다음 원격 컴퓨터에서 호출된 프로세스에서 받았는지 후 DataSet 개체를 조정해야 할 때 표준 시간대 정보를 전달해야 합니다. 이렇게 하려면 다음과 같이 하십시오.
  1. 웹 서비스 프로젝트를 원격 컴퓨터에서 클라이언트 응용 프로그램의 표준 시간대를 따라 DateTime 값을 조정하여 코드를 작성하십시오. 이렇게 하려면 다음과 같이 하십시오.
    1. Service1 다음 코드를 추가합니다 "웹 서비스 만들기" 절에서 지정한 대로 클래스:
      [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 메서드는 클라이언트 응용 프로그램의 원래 시간을 반영하도록 DateTime 값을 조정합니다. 여기서 ExtendedPropertiesDataSet 클래스의 속성을 UTC (지역 표준시) 오프셋을 DataSet 개체를 저장하는 데 사용됩니다. ExtendedProperties 속성으로 DataSet 개체 사용하여 사용자 지정 정보를 저장할 수 있습니다. DataSet 개체를 원격 원하는 경우 ExtendedProperties 문자열로 UTC 오프셋을 저장해야 하는 컬렉션.
    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 메서드는 DateTime 개체를 조정할 수 있습니다. 특정 행에 DateTime 열에서 원래 시간을 가져와서 로컬 시간으로 따라 클라이언트 응용 프로그램의 수정합니다.
  2. 클라이언트 응용 프로그램에서 웹 서비스 표준 시간대 정보가 조정되는지 확인하고 코드를 작성하십시오. 이렇게 하려면 다음과 같이 하십시오.
    1. 다음 코드를 Main 을 추가하여 "클라이언트 응용 프로그램 만들기" 절에서 지정한 코드 뒤에 함수:
      str=myDatasetService.AdjustDSTimeZone(myDataset );
      Console.WriteLine (str);
      Console.ReadLine ();
    2. 솔루션 탐색기에서 모든 폴더를 확장하십시오.
    3. WebReference1, 마우스 오른쪽 단추로 클릭하고 웹 참조 업데이트를 클릭하십시오.
    4. 파일 메뉴에서 모두 저장 응용 프로그램을 저장하려면 클릭하십시오.
    5. 빌드 메뉴에서 응용 프로그램을 빌드할 때 솔루션 빌드 클릭하십시오.
    6. 디버그 메뉴에서 응용 프로그램을 실행하려면 시작 을 클릭하십시오.
클라이언트 응용 프로그램은 DateTime 열이 들어 있는 MyTable 테이블을 연결합니다. 웹 서비스 개체를 만들고 웹 AdjustDSTimeZone 메서드로 DataSet 클래스의 개체를 전달하여 서비스. 웹 서비스의 AdjustDSTimeZone 메서드를 사용하여 DateTime 업데이트하여 해당 MyTable 열에 따라 표준 시간대 클라이언트 응용 프로그램 및 다음 반환합니다 MyTable 테이블의 첫 번째 행의 DateTime 값이 표. 클라이언트 응용 프로그램에서 받은 DateTime 값이 웹 클라이언트 응용 프로그램에 의해 전달된 값과 같은지 서비스.

현재 상태

이것은 의도적으로 설계된 동작입니다.

추가 정보

문제를 재현하는 방법

데이터베이스 테이블 만들기

인스턴스를 Microsoft SQL 데이터베이스 테이블을 만들려면 서버를 다음과 같이 하십시오.
  1. SQL 쿼리 분석기를 시작하십시오.
  2. 파일 메뉴에서 새로 만들기 를 클릭하십시오.
  3. 새 쿼리 창 을 클릭한 다음 확인 을 누릅니다.
  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 테이블을 만들고 테이블에 두 개의 값으로 업데이트됩니다.

웹 서비스 만들기

DateTime 값이 클라이언트 응용 프로그램에서 받는 원격 컴퓨터에서 웹 서비스 프로젝트를 만듭니다. 이렇게 하려면 다음과 같이 하십시오.
  1. Microsoft Visual Studio .NET 시작하십시오.
  2. 파일 메뉴에서 새로 만들기를 가리킨 다음 프로젝트 를 클릭하십시오.
  3. 프로젝트 형식 에서 Visual C# 프로젝트 를 클릭한 다음 템플릿 에서 ASP.NET 웹 서비스 를 누릅니다.
  4. 이름 상자에 MyWebService 를 입력한 다음 확인 을 누릅니다. 기본적으로 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 메서드는 클라이언트 응용 프로그램에서 전달된 DataSet 개체를 받습니다. 이 메서드는 클라이언트 응용 프로그램에 MyTable 테이블의 첫 번째 행의 DateTime 값을 반환합니다.
  9. 파일 메뉴에서 모두 저장 응용 프로그램을 저장하려면 클릭하십시오.
  10. 빌드 메뉴에서 눌러 빌드 솔루션 응용 프로그램을 빌드합니다.

클라이언트 응용 프로그램 만들기

원격 웹 서비스는 DataSet 개체를 전달합니다 클라이언트 응용 프로그램을 만들려면 다음과 같이 하십시오.
  1. Microsoft Visual Studio .NET 시작하십시오.
  2. 파일 메뉴에서 새로 만들기를 가리킨 다음 프로젝트 를 클릭하십시오.
  3. 프로젝트 형식 에서 Visual C# 프로젝트 를 클릭한 다음 템플릿 에서 콘솔 응용 프로그램 을 누릅니다.
  4. 이름 상자에 MyDataSet 를 입력한 다음 확인 을 누릅니다. 기본적으로 Class1.cs 파일이 만들어집니다.
  5. 파일의 시작 부분에 다음 코드를 추가하여:
    using System.Data;
    using System.Data.SqlClient;
    using System.Timers;
    using System.Diagnostics;
  6. 다음 코드를 Main 을 추가하여 함수:
    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. 솔루션 탐색기 에서 참조 를 마우스 오른쪽 단추로 클릭하고 웹 참조 추가 클릭하십시오.
  8. URL 상자에 http://RemoteServer/MyWebService/Service1.asmx 을 입력하고 이동 을 클릭하십시오. 기본적으로 Visual Studio .NET 2002의 웹 WebReference1 라는 참조가 만들어집니다.

    참고RemoteServer 웹 서비스를 만들 위치를 원격 서버의 이름 자리 표시자입니다.
  9. 웹 참조 이름WebReference1 Microsoft Visual Studio .NET 2003에서 입력하십시오 상자에. 다음은 WebReference1 코드 구문을 일치시키는 데 사용됩니다.
  10. 참조 추가 클릭하십시오.
  11. 파일 메뉴에서 모두 저장 응용 프로그램을 저장하려면 클릭하십시오.
  12. 빌드 메뉴에서 눌러 빌드 솔루션 응용 프로그램을 빌드합니다.
  13. 디버그 메뉴에서 응용 프로그램을 실행하려면 시작 을 클릭하십시오.
클라이언트 응용 프로그램에서 첫 번째 행의 DateTime 열을 수정합니다. 현재 날짜 및 시간 클라이언트 응용 프로그램의 코드를 DateTime 값을 설정합니다. 웹 서비스는 DataSet 개체를 전달합니다. 웹 서비스를 DataSet 개체를 받습니다 첫 번째 행에서 DateTime 열의 값을 검색하고 클라이언트 응용 프로그램에 다시 값을 반환합니다. 웹 서비스에서 반환되는 DateTime 값이 지정된 "현상" 원격 서버의 표준 시간대 정보로 의하면 변경된 섹션.

.NET Framework Remoting

응용 프로그램에서 .NET Framework 원격 서비스를 구현 및 .NET Framework 웹 서비스 메서드를 호출할 경우 DataSetSurrogate 클래스 코드를 사용할 수 있습니다.DataSetSurrogate 클래스에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
829740데이터 집합 serialization 및 원격 성능 향상
DataSetSurrogate 클래스 DateTime 열에 로컬 시간 영역을 조정할 수 없습니다. 또한 이 클래스는 .NET Framework Remoting 중에 더 나은 성능을 제공합니다. DataSetSurrogate 클래스 DataSet 클래스의 기본 직렬화 무시하고 DataSetSurrogate 클래스 및 멤버에 포함된 이진 형태로 serialize합니다.

참조

자세한 내용은 다음 Microsoft 개발자 네트워크 (MSDN) 웹 사이트를 방문하십시오.
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
키워드:?
kbmt kbtshoot kbwebservices kbremoting kbclient kbsystemdata kbsqlclient kbservice kbprb KB842545 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

피드백 보내기

 

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