Remoto i valori DateTime in un oggetto DataSet vengono convertiti nell'ora locale equivalente di un computer remoto in un diverso fuso orario

Traduzione articoli Traduzione articoli
Identificativo articolo: 842545 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

Quando si passa un oggetto della classe DataSet a un servizio Web remoto o a un servizio Web che si trova in un fuso orario diverso dal fuso orario dell'applicazione chiamante, le colonne DateTime di una tabella contenuta vengono convertite nell'ora locale equivalente. Le colonne DateTime vengono convertite in quanto il codice System.Data.DataSet adatta per l'ora locale equivalente in base al fuso orario del computer remoto. Ad esempio, se un valore di 5: 00 viene passato da un computer client in Pacifico a un servizio Web fuso orientale, il valore nell'oggetto DataSet cambia per 8: 00 al metodo ricevente del servizio Web. In questo articolo viene descritto come risolvere il problema passando l'informazioni sul fuso orario dall'applicazione client al servizio Web, modificare le colonne DateTime sul computer remoto. Il System.Data è di spazio dei nomi contiene class. il DataSet

Sintomi

I valori delle colonne DateTime cambiano quando si passa un oggetto System.Data.DataSet a un servizio Web o a un servizio Web remoto. Questo problema si verifica quando il servizio Web o servizio Web remoto è in un fuso orario diverso rispetto all'applicazione client. I valori nelle colonne DateTime vengono convertiti nell'ora locale equivalente in base al fuso orario del computer remoto.

Cause

Durante la serializzazione dell'oggetto DataSet viene memorizzato il fuso orario dell'applicazione client. Viene deserializzato l'oggetto DataSet dopo la ricezione e il codice System.Data.DataSet regola le colonne DateTime equivalente all'ora locale del computer remoto in cui in un fuso orario diverso.

Workaround

Per risolvere questo problema, è necessario passare informazioni per il fuso orario quando viene creato l'oggetto DataSet nell'applicazione client, e quindi è necessario modificare l'oggetto DataSet dopo ricevuto durante la chiamata del computer remoto. Per effettuare questa operazione, attenersi alla seguente procedura:
  1. Nel progetto di servizio Web sul computer remoto, scrivere codice che consente di regolare i valori DateTime in base per il fuso orario dell'applicazione client. Per effettuare questa operazione, attenersi alla seguente procedura:
    1. Aggiungere il codice seguente nel Service1 classe come specificato nella sezione "Creazione di un servizio 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;
      }
      
      il metodo AdjustDSTimeZone consente di regolare i valori DateTime per riflettere l'ora originale dell'applicazione client. In questo caso il ExtendedProperties proprietà della classe DataSet viene utilizzata per memorizzare l'offset UTC (Coordinated Universal Time) con l'oggetto DataSet . Con la proprietà ExtendedProperties , è possibile memorizzare informazioni personalizzate con l'oggetto DataSet . Se si desidera che l'oggetto DataSet da remoto, è necessario memorizzare l'offset UTC come stringa il ExtendedProperties insieme.
    2. Aggiungere il seguente codice sotto il AdjustDSTimeZone metodo:
      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. Nel menu file , fare clic su Salva tutto per salvare l'applicazione.
    4. Dal menu Genera scegliere Genera soluzione per generare l'applicazione.
    Il metodo di AdjustDateTimeValues rende l'oggetto DateTime la rettifica. Ottiene l'ora originale dalla colonna DateTime di una riga specifica e quindi modificato in base all'ora locale dell'applicazione client di.
  2. Nell'applicazione client, scrivere codice che consente di verificare che il servizio Web è regolata l'informazioni sul fuso orario. Per effettuare questa operazione, attenersi alla seguente procedura:
    1. Aggiungere il codice seguente nella principale funzione dopo il codice che è specificato nella sezione "Creazione di un'applicazione client":
      str=myDatasetService.AdjustDSTimeZone(myDataset );
      Console.WriteLine (str);
      Console.ReadLine ();
    2. In Esplora soluzioni espandere tutte le cartelle.
    3. Fare clic con il pulsante destro del mouse su WebReference1 e quindi fare clic su Aggiorna riferimento Web .
    4. Nel menu file , fare clic su Salva tutto per salvare l'applicazione.
    5. Dal menu Genera scegliere Genera soluzione per generare l'applicazione.
    6. Dal menu debug , scegliere Avvia per eseguire l'applicazione.
L'applicazione di client si connette alla tabella MyTable che contiene una colonna DateTime. Creato un oggetto del servizio Web e si passa un oggetto della classe DataSet al metodo AdjustDSTimeZone del Web servizio. Il metodo di AdjustDSTimeZone nel servizio Web Aggiorna DateTime tabella colonna della tabella in base al fuso orario dell'applicazione client e quindi restituisce il valore DateTime della prima riga della tabella MyTable. Il valore di DateTime ricevuto dall'applicazione client corrisponde a quello del valore passato dall'applicazione client sul Web servizio.

Status

Questo comportamento legato alla progettazione.

Informazioni

Procedura per riprodurre il problema

Creare una tabella di database

Per creare una tabella di database in un'istanza di Microsoft SQL Server, attenersi alla seguente procedura:
  1. Avviare SQL Query Analyzer.
  2. Nel menu file , fare clic su Nuovo .
  3. Fare clic su Finestra Query vuota e quindi fare clic su OK .
  4. Incollare il codice riportato di seguito nella finestra della query. Questo codice crea la tabella 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. Nel menu query , fare clic su Esegui per eseguire la query. La tabella viene creata la tabella e la tabella viene aggiornata con due valori.

Creare un servizio Web

Consente di creare un progetto di servizio Web su un computer remoto che riceve i valori DateTime da un'applicazione client. Per effettuare questa operazione, attenersi alla seguente procedura:
  1. Avviare Microsoft Visual Studio .NET.
  2. Scegliere Nuovo dal menu file , quindi progetto .
  3. In Tipi progetto fare clic su Progetti di Visual C# e quindi fare clic su Servizio Web ASP.NET in modelli .
  4. Nella casella nome digitare MyWebService e quindi fare clic su OK . Per impostazione predefinita, viene creato il file Service1.asmx.
  5. In Esplora soluzioni, fare clic con il pulsante destro del mouse sul file Service1.asmx e quindi scegliere Visualizza codice .
  6. Aggiungere il codice riportato di seguito all'inizio del file:
    using System.Data.SqlClient;
    using System.Timers;
  7. Individuare il codice seguente nel Service1 classe:
    public class Service1 : System.Web.Services.WebService
    {
  8. Aggiungere il codice riportato di seguito dopo il codice individuato nel passaggio 7:
    [WebMethod]
    public String DataSetReturn( DataSet clientDataSet )
    {
      string str;				
      str=clientDataSet.Tables["MyTable"].Rows[0][1].ToString() ;
      return str;	
    }
    il metodo DataSetReturn riceve un oggetto del DataSet che viene passato dall'applicazione client. Questo metodo restituisce il valore di DateTime della prima riga della tabella MyTable per l'applicazione client.
  9. Nel menu file , fare clic su Salva tutto per salvare l'applicazione.
  10. Scegliere dal menu Genera , Genera soluzione per generare l'applicazione.

Creare un'applicazione client

Per creare un'applicazione client che passa un oggetto DataSet al servizio Web remoto, attenersi alla seguente procedura:
  1. Avviare Microsoft Visual Studio .NET.
  2. Scegliere Nuovo dal menu file , quindi progetto .
  3. In Tipi progetto fare clic su Progetti di C# e quindi fare clic su Applicazione Console in modelli .
  4. Nella casella nome digitare MyDataSet e quindi fare clic su OK . Per impostazione predefinita, viene creato il file Class1.cs.
  5. Aggiungere il codice riportato di seguito all'inizio del file:
    using System.Data;
    using System.Data.SqlClient;
    using System.Timers;
    using System.Diagnostics;
  6. Aggiungere il codice seguente nel principale funzione:
    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 ();
    
    Nota per la tabella di accedere alla tabella, è necessario modificare le informazioni relative al server e le informazioni del database insieme con il nome utente e la password per stabilire la connessione con Microsoft SQL Server.
  7. In Esplora soluzioni, fare clic con il pulsante destro del mouse su riferimenti e quindi fare clic su Aggiungi riferimento Web .
  8. Nella casella URL digitare http:// RemoteServer /MyWebService/Service1.asmx e quindi fare clic su Vai . Per impostazione predefinita, in Visual Studio .NET 2002, un Web viene creato il riferimento denominato WebReference1.

    Nota RemoteServer è un segnaposto per il nome del server remoto in cui viene creato il servizio Web.
  9. In Microsoft Visual Studio .NET 2003, digitare WebReference1 nel Nome riferimento Web casella. In questo caso WebReference1 viene utilizzato in modo che corrisponda la sintassi del codice.
  10. Scegliere Aggiungi riferimento .
  11. Nel menu file , fare clic su Salva tutto per salvare l'applicazione.
  12. Scegliere dal menu Genera , Genera soluzione per generare l'applicazione.
  13. Dal menu debug , scegliere Avvia per eseguire l'applicazione.
L'applicazione client consente di modificare la colonna DateTime della prima riga. Il codice imposta il valore DateTime la data corrente e l'ora dell'applicazione client. Il servizio Web invia un oggetto DataSet . Il servizio Web riceve l'oggetto DataSet , recupera il valore della colonna DateTime dalla prima riga e restituisce il valore all'applicazione client. Il valore di DateTime restituito dal servizio Web viene modificato in base alle informazioni fuso orario del server remoto come specificati in "Sintomi" sezione.

Servizi remoti .NET framework

Se si implementa i servizi remoti di .NET Framework nell'applicazione e non si chiama un metodo di servizio Web .NET Framework, è possibile utilizzare il codice della classe DataSetSurrogate .Per ulteriori informazioni sulla classe DataSetSurrogate, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
829740Miglioramento delle prestazioni serializzazione e i servizi remoti di DataSet
La classe DataSetSurrogate impedisce le rettifiche della zona ora locale nelle colonne DateTime. Questa classe fornisce inoltre prestazioni migliori durante i servizi remoti .NET Framework. La classe DataSetSurrogate esegue l'override della serializzazione predefinita della classe DataSet e serializza la classe DataSetSurrogate e i relativi membri contenuti in formato binario.

Riferimenti

Per ulteriori informazioni, visitare il seguente sito Web Microsoft Developer Network (MSDN):
System.Data.SqlClient dello spazio dei nomi
http://msdn2.microsoft.com/en-us/library/system.data.sqlclient(vs.71).aspx
DataSet.ExtendedProperties proprietà
http://msdn2.microsoft.com/en-us/library/system.data.dataset.extendedproperties(vs.71).aspx

Proprietà

Identificativo articolo: 842545 - Ultima modifica: venerdì 18 maggio 2007 - Revisione: 1.5
Le informazioni in questo articolo si applicano a:
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0
Chiavi: 
kbmt kbtshoot kbwebservices kbremoting kbclient kbsystemdata kbsqlclient kbservice kbprb KB842545 KbMtit
Traduzione automatica articoli
Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 842545
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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