Extern DateTime-waarden in een DataSet-object geconverteerd naar de overeenkomstige lokale tijd van een externe computer in een andere tijdzone

Vertaalde artikelen Vertaalde artikelen
Artikel ID: 842545 - Bekijk de producten waarop dit artikel van toepassing is.
Alles uitklappen | Alles samenvouwen

Op deze pagina

Samenvatting

Wanneer u een klasse van de DataSet-object doorgeeft aan een externe Webservice of een Web service is in een zone die is anders dan de tijdzone van de telefoonkaart toepassing, DateTime-kolommen in een tabel die zijn geconverteerd naar de vergelijkbare lokale tijd. DateTime-kolommen worden geconverteerd, omdat de System.Data.DataSet code wordt aangepast aan de overeenkomstige lokale tijd op de tijdzone van de externe computer. Als de waarde 5: 00 wordt doorgegeven vanaf een clientcomputer in Pacific Time met een webservice in Eastern Time, verandert de waarde in de DataSet-object bijvoorbeeld om 8: 00 in de ontvangende methode van de webservice. Dit artikel wordt beschreven hoe u dit probleem omzeilen door de tijdzone informatie van de clienttoepassing naar de webservice en door de DateTime-kolommen op de externe computer. De System.Data is de naamruimte die de klasse DataSet bevat.

Symptomen

De waarden van de DateTime-kolommen wijzigen als u eenSystem.Data.DataSetobject naar een webservice of een externe webservice. Dit probleem Wanneer de webservice of een externe webservice in een andere tijdzone dan is de clienttoepassing. De waarden in de DateTime-kolommen worden geconverteerd naar de vergelijkbare lokale tijd volgens de tijdzone van de externe computer.

Oorzaak

De tijdzone van de clienttoepassing opgeslagen tijdens deDataSetobject serialisatie. DeDataSetobject gedeserialiseerd ontvangende einde en deSystem.Data.DataSetpast de DateTime-kolommen met overeenkomstige lokale code tijd van de externe computer in een andere tijdzone.

Workaround

Dit probleem wilt omzeilen, moet u informatie doorgeven zone over de tijd wanneer deDataSetobject gemaakt in de clienttoepassing en vervolgens moet u aanpassen deDataSetobject nadat deze is ontvangen in het aangeroepen proces op de externe computer. U doet dit als volgt:
  1. Schrijf code past in het project Web service op de externe computer, deDateTimewaarden op basis van de tijd de zone van de clienttoepassing. U doet dit als volgt:
    1. Voeg de volgende code in deService1klasse die is opgegeven in de sectie 'Web-service maken'
      [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;
      }
      
      DeAdjustDSTimeZonemethode past deDateTimewaarden om de oorspronkelijke tijd van de clienttoepassing. Hier deExtendedPropertieseigenschap van deDataSetklasse wordt gebruikt voor het opslaan van Coordinated Universal Time Offset (UTC) met deDataSetobject. Met deExtendedPropertieseigenschap, kunt u aangepaste gegevens over met deDataSetobject. Als u deDataSetobject extern, moet u de UTC-afwijking opslaan als een tekenreeks in deExtendedPropertiescollectie.
    2. Voeg de volgende code hieronder deAdjustDSTimeZonemethode:
      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. Op deBestandmenu, klik opOpslaan Allede toepassing opslaan.
    4. Op deBouwenmenu, klik opOplossing bouwende toepassing te bouwen.
    DeAdjustDateTimeValuesmethode maakt de aanpassing deDateTimeobject. Het oorspronkelijke tijdstip verkrijgt uit de DateTime-kolom van een bepaalde rij en op de lokale tijd van de de clienttoepassing.
  2. De clienttoepassing code schrijven die controleert dat de webservice de tijdzonegegevens heeft aangepast. Doen Dit als volgt:
    1. Voeg de volgende code in deHoofdvensterfunctie na de code die is opgegeven in de sectie 'Een clienttoepassing maken'
      str=myDatasetService.AdjustDSTimeZone(myDataset );
      Console.WriteLine (str);
      Console.ReadLine ();
    2. Vouw alle mappen in de Solution Explorer.
    3. Klik met de rechtermuisknopWebReference1, en Klik opWebverwijzing bijwerken.
    4. Op deBestandmenu, klik opOpslaan Allede toepassing opslaan.
    5. Op deBouwenmenu, klik opOplossing bouwende toepassing te bouwen.
    6. Op deFoutopsporingmenu, klik opStartde toepassing wordt uitgevoerd.
De clienttoepassing verbinding maakt met de MyTable tabel een datum/tijd-kolom bevat. Maakt u een object van de webservice en gangen een object van hetDataSetklasse om deAdjustDSTimeZonemethode van het Web service. DeAdjustDSTimeZonemethode in de webservice de DateTime bijgewerkt kolom van de tabel MyTable volgens de tijdzone van de client toepassing en retourneert de DateTime-waarde van de eerste rij van de Table MyTable. DeDateTimede waarde die door de clienttoepassing is ontvangen hetzelfde als de waarde die is doorgegeven door de clienttoepassing op het Web service.

Status

Dit gedrag is ontwerpen.

Meer informatie

Stappen om het probleem te reproduceren

Maken van een databasetabel

Een databasetabel in een Microsoft SQL-exemplaar maken Server, als volgt:
  1. Start SQL Query Analyzer.
  2. Op deBestandmenu, klik opNieuwe.
  3. Klik opLege queryvenster, en klik vervolgens opOK.
  4. Plak de volgende code in het queryvenster. Deze code de tabel MyTable gemaakt.
    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. Op deQuerymenu, klik opUitvoerende query uitvoeren. De MyTable tabel gemaakt en wordt de tabel met twee waarden bijgewerkt.

Een webservice maken

Een project Web service die op een externe computer maken ontvangt deDateTimewaarden uit een clienttoepassing. Volg hiertoe deze stappen:
  1. Start Microsoft Visual Studio.NET.
  2. Op deBestandin het menuNieuwe, en klik vervolgens opProject.
  3. OnderProjecttypen, klik opVisuele C#-projecten, en klik vervolgens opASP.NET Web ServiceonderSjablonen.
  4. In deNaamin het vakMyWebService, en klik vervolgens opOK. Door Standaard wordt het bestand Service1.asmx gemaakt.
  5. In de Solution Explorer met de rechtermuisknop op deService1.asmxbestand en klik vervolgens opWeergave Code.
  6. Voeg de volgende code aan het begin van het bestand:
    using System.Data.SqlClient;
    using System.Timers;
  7. Zoek de volgende code in deService1klasse:
    public class Service1 : System.Web.Services.WebService
    {
  8. Voeg de volgende code na de code die u in stap 7 hebt gevonden:
    [WebMethod]
    public String DataSetReturn( DataSet clientDataSet )
    {
      string str;				
      str=clientDataSet.Tables["MyTable"].Rows[0][1].ToString() ;
      return str;	
    }
    DeDataSetReturnmethode ontvangt u een object van hetDataSetdat is doorgegeven door de clienttoepassing. Deze methode retourneert deDateTimewaarde van de eerste rij van de tabel MyTable de clienttoepassing.
  9. Op deBestandmenu, klik opOpslaan Allede toepassing opslaan.
  10. Op deBouwenmenu, klik opBouwen Oplossingde toepassing te bouwen.

Een toepassing maken

Maken van een clienttoepassing waarmee eenDataSetobject de externe webservice als volgt:
  1. Start Microsoft Visual Studio.NET.
  2. Op deBestandin het menuNieuwe, en klik vervolgens opProject.
  3. OnderProjecttypen, klik opVisuele C#-projecten, en klik vervolgens opConsole ToepassingonderSjablonen.
  4. In deNaamin het vakMyDataSet, en klik vervolgens opOK. Door Standaard wordt het bestand Class1.cs gemaakt.
  5. Voeg de volgende code aan het begin van het bestand:
    using System.Data;
    using System.Data.SqlClient;
    using System.Timers;
    using System.Diagnostics;
  6. Voeg de volgende code in deHoofdvensterfunctie:
    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 ();
    
    OpmerkingToegang tot de MyTable tabel, wijzigt u de servergegevens van de en de database informatie met de gebruikersnaam en het wachtwoord voor de vaststelling van de verbinding met Microsoft SQL Server.
  7. In de Solution Explorer met de rechtermuisknopVerwijzingen, en klik vervolgens opWeb toevoegen Verwijzing.
  8. In deURLin het vakhttp://ExterneServer/MyWebService/Service1.asmx, en Klik vervolgens opGa naar. Standaard in Visual Studio.2002 NET een Web verwijzing met de naam WebReference1 gemaakt.

    OpmerkingExterneServereen tijdelijke aanduiding voor de naam van de externe server waar de webservice wordt gemaakt.
  9. In Microsoft Visual Studio.2003 NET, typeWebReference1in deWeb referentienaamvak. HierWebReference1aan de code wordt gebruikt syntaxis.
  10. Klik opVerwijzing toevoegen.
  11. Op deBestandmenu, klik opOpslaan Allede toepassing opslaan.
  12. Op deBouwenmenu, klik opBouwen Oplossingde toepassing te bouwen.
  13. Op deFoutopsporingmenu, klik opStartde toepassing wordt uitgevoerd.
De clienttoepassing wijzigt de DateTime-kolom van de eerste rij. De code stelt deDateTimede waarde voor de huidige datum en tijd van de client toepassing. Het geeft eenDataSetwebservice-object. De webservice ontvangt deDataSetobject, haalt de waarde van de kolom DateTime de eerste rij en retourneert de waarde terug naar de clienttoepassing. DeDateTimewaarde die wordt geretourneerd door de webservice wordt gewijzigd volgens de tijdzone-informatie van de externe server die is opgegeven in de sectie 'Symptomen' sectie.

.NET Framework remoting

Implementeert u het.NET Framework remoting services in uw toepassing en u roept niet een .NET Framework Web service methode kunt u deDataSetSurrogateklassecode.Klik op het volgende artikelnummer in de Microsoft Knowledge Base voor meer informatie over de klasse DataSetSurrogate:
829740DataSet serialisatie en externe prestaties verbeteren
DeDataSetSurrogateklasse voorkomt dat de aanpassingen van de zone Lokale tijd op de DateTime-kolommen. Deze klasse biedt ook betere prestaties .NET Framework remoting. DeDataSetSurrogateklasse overschrijft de standaard-serialisatie van deDataSetklasse- en serializes deDataSetSurrogateklasse en haar in leden in binaire vorm.

Referenties

Bezoek de volgende Microsoft voor meer informatie. Developer Network (MSDN)-websites:
System.Data.SqlClient naamruimte
http://msdn2.Microsoft.com/en-us/library/System.Data.SqlClient (vs.71) .aspx
DataSet.ExtendedProperties eigenschap
http://msdn2.Microsoft.com/en-us/library/System.Data.DataSet.extendedproperties (vs.71) .aspx

Eigenschappen

Artikel ID: 842545 - Laatste beoordeling: donderdag 17 maart 2011 - Wijziging: 2.0
De informatie in dit artikel is van toepassing op:
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0
Trefwoorden: 
kbtshoot kbwebservices kbremoting kbclient kbsystemdata kbsqlclient kbservice kbprb kbmt KB842545 KbMtnl
Automatisch vertaald artikel
BELANGRIJK: Dit artikel is vertaald door de vertaalmachine software van Microsoft in plaats van door een professionele vertaler. Microsoft biedt u professioneel vertaalde artikelen en artikelen vertaald door de vertaalmachine, zodat u toegang heeft tot al onze knowledge base artikelen in uw eigen taal. Artikelen vertaald door de vertaalmachine zijn niet altijd perfect vertaald. Deze artikelen kunnen fouten bevatten in de vocabulaire, zinsopbouw en grammatica en kunnen lijken op hoe een anderstalige de taal spreekt en schrijft. Microsoft is niet verantwoordelijk voor onnauwkeurigheden, fouten en schade ontstaan door een incorrecte vertaling van de content of het gebruik ervan door onze klanten. Microsoft past continue de kwaliteit van de vertaalmachine software aan door deze te updaten.
De Engelstalige versie van dit artikel is de volgende:842545

Geef ons feedback

 

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