Удаленные значения DateTime в объект DataSet, преобразуются в эквивалентные местное время на удаленном компьютере, который находится в другом часовом поясе

Переводы статьи Переводы статьи
Код статьи: 842545 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Аннотация

При передаче объекта класса набора данных на удаленный веб-службу или веб-службу, которая находится в часовом поясе, отличном от пояса вызывающего приложения, столбцами типа DateTime вложенные таблицы преобразуются в эквивалентные локальное время. Столбцы типа DateTime преобразуются из-за кода System.Data.DataSet корректирует эквивалент местное время в соответствии с часовым поясом на удаленном компьютере. Например в Восточное время передается значение 5: 00 с клиентского компьютера в тихоокеанскому времени на веб-службу, значение в объект DataSet изменяет с 8: 00 в методе, принимающем веб-службы. В данной статье описывается, как для решения этой проблемы путем передачи сведений о часовом поясе из клиентского приложения на веб-службу и настройка столбцов типа DateTime на удаленном компьютере. System.Data — это пространство имен содержит класс набора данных.

Проблема

Изменить значения столбцов типа DateTime, при передачеSystem.Data.DataSetобъект, для веб-службы или удаленного веб-службы. Данная проблема возникает, когда веб-службы или удаленного веб-службы в другом часовом поясе, чем клиентское приложение. Значения в столбцах DateTime преобразуются в эквивалентные местное время в соответствии с часовым поясом на удаленном компьютере.

Причина

Сохраняются во время часового пояса клиентского приложенияНабор данныхсериализация объекта. надписьюНабор данныхв конце приемки десериализуется объект иSystem.Data.DataSetкод изменяет столбцы типа DateTime в эквивалентное время локальный на удаленном компьютере, который находится в другом часовом поясе.

Временное решение

Чтобы обойти эту проблему, необходимо передать сведения о часовом поясе приНабор данныхobject is created in the client application, and then you must adjust theНабор данныхobject after it has been received in the called process on the remote computer. Выполните следующие действия::
  1. In the Web service project on the remote computer, write code that adjusts theDateTimevalues according to the time zone of the client application. Выполните следующие действия::
    1. Добавьте следующий код вService1class as specified in the "Create a Web service" section:
      [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;
      }
      
      надписьюAdjustDSTimeZonemethod adjusts theDateTimevalues to reflect the original time of the client application. Here theExtendedPropertiesСвойствоНабор данныхclass is used to store the Coordinated Universal Time (UTC) offset with theНабор данныхОбъект. В консоли восстановления командаExtendedPropertiesproperty, you can store custom information with theНабор данныхОбъект. Если требуетсяНабор данныхobject to be remoted, you must store the UTC offset as a string in theExtendedPropertiesКоллекция.
    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. в менюФайл:выберите пунктСохранить всеto save the application.
    4. в менюПостроениевыберите пунктПостроение решенияto build the application.
    надписьюAdjustDateTimeValuesmethod makes the adjustment to theDateTimeОбъект. It obtains the original time from the DateTime column of a particular row and then modifies according to the local time of the client application.
  2. In the client application, write code that verifies that the Web service has adjusted the time zone information. Выполните следующие действия::
    1. Добавьте следующий код вОсновной номер:function after the code that is specified in the "Create a client application" section:
      str=myDatasetService.AdjustDSTimeZone(myDataset );
      Console.WriteLine (str);
      Console.ReadLine ();
    2. In Solution Explorer, expand all folders.
    3. Щелкните правой кнопкой мышиWebReference1и выберите командуUpdate Web Reference.
    4. в менюФайл:выберите пунктСохранить всеto save the application.
    5. в менюПостроениевыберите пунктПостроение решенияto build the application.
    6. в менюОтладкавыберите пунктSTART ::для запуска приложения.
The client application connects to the MyTable table that contains a DateTime column. It creates an object of the Web service and passes an object of theНабор данныхclass to theAdjustDSTimeZonemethod of the Web service. надписьюAdjustDSTimeZonemethod in the Web service updates the DateTime column of the MyTable table according to the time zone of the client application and then returns the DateTime value of the first row of the MyTable table. надписьюDateTimevalue that is received by the client application is the same as the value that is passed by the client application to the Web service.

Статус

Такое поведение является особенностью данного продукта..

Дополнительная информация

Действия по воспроизведению проблемы

Create a database table

To create a database table in an instance of Microsoft SQL Server, follow these steps:
  1. Запустите приложение SQL Query Analyzer..
  2. в менюФайл:выберите пунктСОЗДАТЬ..
  3. затем –Blank Query Windowи выберите командуOk..
  4. Paste the following code in the query window. This code creates the MyTable table.
    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. в менюQuery:выберите пунктвыполнен.to run the query. The MyTable table is created, and the table is updated with two values.

Создание веб-службы

Create a Web service project on a remote computer that receives theDateTimevalues from a client application. Выполните следующие действия::
  1. Запустите Microsoft Visual Studio .NET..
  2. в менюФайл:Выберите пункт менюСОЗДАТЬ.и выберите командуProject.
  3. Из спискаТипы проектовзатем –Visual Проекты C#и выберите командуASP.NET Web ServiceИз спискаШаблоны:.
  4. В диалоговом окнеИМЯполе типаMyWebServiceи выберите командуOk.. By default, the Service1.asmx file is created.
  5. В обозревателе решений щелкните правой кнопкой мышиService1.asmxи выберите пунктПросмотр кода.
  6. Add the following code at the beginning of the file:
    using System.Data.SqlClient;
    using System.Timers;
  7. Locate the following code in theService1Класс::
    public class Service1 : System.Web.Services.WebService
    {
  8. Add the following code after the code that you located in step 7:
    [WebMethod]
    public String DataSetReturn( DataSet clientDataSet )
    {
      string str;				
      str=clientDataSet.Tables["MyTable"].Rows[0][1].ToString() ;
      return str;	
    }
    надписьюDataSetReturnmethod receives an object of theНабор данныхthat is passed by the client application. This method returns theDateTimevalue of the first row of the MyTable table to the client application.
  9. в менюФайл:выберите пунктСохранить всеto save the application.
  10. в менюПостроениевыберите пунктПостроение решенийto build the application.

Создание клиентского приложения

To create a client application that passes aНабор данныхobject to the remote Web service, follow these steps:
  1. Запустите Microsoft Visual Studio .NET..
  2. в менюФайл:Выберите пункт менюСОЗДАТЬ.и выберите командуProject.
  3. Из спискаТипы проектовзатем –Visual Проекты C#и выберите командуКонсольного приложенияИз спискаШаблоны:.
  4. В диалоговом окнеИМЯполе типаMyDataSetи выберите командуOk.. By default, the Class1.cs file is created.
  5. Add the following code at the beginning of the file:
    using System.Data;
    using System.Data.SqlClient;
    using System.Timers;
    using System.Diagnostics;
  6. Добавьте следующий код вОсновной номер:function::
    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 ();
    
    Примечание.To access the MyTable table, you must modify the server information and the database information together with the user name and the password for establishing the connection with the Microsoft SQL Server.
  7. В обозревателе решений щелкните правой кнопкой мышиСсылкии выберите командуAdd Web Reference.
  8. В диалоговом окнеURL-адресполе типаhttp://удаленный_сервер/MyWebService/Service1.asmxи выберите командуПерейти. По умолчанию в Visual Studio .NET 2002, ссылка с именем WebReference1 создается веб-узел.

    Примечание.удаленный_сервер— Это имя удаленного сервера, где создается веб-службы.
  9. В Microsoft Visual Studio .NET 2003 введитеWebReference1В диалоговом окнеИмя ссылки на веб-узлаполе. здесьWebReference1используется для сопоставления синтаксиса кода.
  10. затем –Добавление ссылки.
  11. в менюФайл:выберите пунктСохранить всеЧтобы сохранить приложение.
  12. в менюПостроениевыберите пунктПостроение решенийЧтобы построить приложение.
  13. в менюОтладкавыберите пунктSTART ::для запуска приложения.
Клиентское приложение изменяет столбец DateTime из первой строки. Задает кодDateTimeзначение текущей даты и времени из клиентского приложения. Он передаетНабор данныхобъект, для веб-службы. Веб-служба получаетНабор данныхобъект, извлекает значение в столбце DateTime из первой строки и возвращает значение клиентскому приложению. надписьюDateTimeзначение, возвращенное веб-службы изменяется в соответствии с сведения о часовом поясе удаленного сервера, как указано в «проблема» раздела.

Удаленное взаимодействие .NET framework

Не следует вызывать метод службы .NET Framework Web служб удаленного взаимодействия .NET Framework при реализации в приложении, можно использоватьDataSetSurrogateкод класса.Для получения дополнительных сведений о классе DataSetSurrogate щелкните следующий номер статьи базы знаний Майкрософт:
829740Повышение быстродействия DataSet сериализации и удаленного доступа
надписьюDataSetSurrogateкласс не коррекции местного часового пояса по столбцам типа DateTime. Этот класс также обеспечивает лучшую производительность во время удаленного взаимодействия .NET Framework. надписьюDataSetSurrogateкласс переопределяет сериализации по умолчаниюНабор данныхкласс и сериализацииDataSetSurrogateкласс и его члены, содержащиеся в двоичной форме.

Ссылки

Для получения дополнительных сведений посетите следующие веб-страницы узла MSDN::
System.Data.SqlClient пространства имен
.aspx HTTP://msdn2.Microsoft.com/en-us/library/System.Data.SqlClient (vs.71)
DataSet.ExtendedProperties свойства
.aspx HTTP://msdn2.Microsoft.com/en-us/library/System.Data.DataSet.ExtendedProperties (vs.71)

Свойства

Код статьи: 842545 - Последний отзыв: 26 ноября 2010 г. - Revision: 2.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0
Ключевые слова: 
kbtshoot kbwebservices kbremoting kbclient kbsystemdata kbsqlclient kbservice kbprb kbmt KB842545 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:842545

Отправить отзыв

 

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