Απομακρυσμένη πρόσβαση τιμές DateTime σε ένα αντικείμενο DataSet μετατρέπονται στην αντίστοιχη τοπική ώρα ενός απομακρυσμένου υπολογιστή που βρίσκεται σε διαφορετική ζώνη ώρας

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 842545 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ανάπτυξη όλων | Σύμπτυξη όλων

Σε αυτήν τη σελίδα

Περίληψη

Όταν περάσει ένα αντικείμενο της κλάσης DataSet σε απομακρυσμένη υπηρεσία Web ή σε μια υπηρεσία Web που βρίσκεται σε μια ζώνη ώρας που είναι διαφορετική από τη ζώνη ώρας από την εφαρμογή κλήσης, οι στήλες ημερομηνία/ώρα σε πίνακα που περιλαμβάνονται μετατρέπονται σε την αντίστοιχη τοπική ώρα. Το DateTime στήλες μετατρέπονται επειδή ο κώδικας System.Data.DataSet προσαρμόζεται στην αντίστοιχη τοπική ώρα σύμφωνα με τη ζώνη ώρας του απομακρυσμένου υπολογιστή. Για παράδειγμα, εάν η τιμή 5: 00 μεταβιβάζεται από έναν υπολογιστή-πελάτη σε ώρα Ειρηνικού σε υπηρεσία Web στην Ανατολική ώρα, αλλάζει η τιμή του αντικειμένου DataSet σε 8: 00 στη μέθοδο λήψης της υπηρεσίας Web. Αυτό το άρθρο περιγράφει τον τρόπο επίλυσης αυτού του ζητήματος, μεταφέροντας τις πληροφορίες ζώνης ώρας από την εφαρμογή-πελάτη στην υπηρεσία Web και προσαρμόζοντας τις στήλες "Ημερομηνία/ώρα" στον απομακρυσμένο υπολογιστή. Το System.Data είναι ο χώρος ονομάτων που περιέχει την κλάση DataSet.

Συμπτώματα

Αλλάξτε τις τιμές των στηλών/ώρα όταν δίνετε μιαSystem.Data.DataSetτο αντικείμενο σε μια υπηρεσία Web ή σε μια απομακρυσμένη υπηρεσία Web. Αυτό το ζήτημα παρουσιάζεται όταν η υπηρεσία Web ή την απομακρυσμένη υπηρεσία Web σας βρίσκεται σε διαφορετική ζώνη ώρας από την εφαρμογή-πελάτη. Οι τιμές στις στήλες DateTime μετατρέπονται σε αντίστοιχη τοπική ώρα, σύμφωνα με τη ζώνη ώρας του απομακρυσμένου υπολογιστή.

Αιτία

Αποθηκεύεται η ζώνη ώρας της εφαρμογής προγράμματος-πελάτη κατά τη διάρκεια τηςΤο DataSetη σειριοποίηση του αντικειμένου. Για ναΤο DataSetαποσειριοποίηση του αντικειμένου στο τέλος λήψης, και τοSystem.Data.DataSetκώδικα ρυθμίζει τις στήλες/ώρα για την αντίστοιχη τοπική ώρα του απομακρυσμένου υπολογιστή που βρίσκεται σε διαφορετική ζώνη ώρας.

Εναλλακτικός τρόπος αντιμετώπισης

Για να επιλύσετε αυτό το ζήτημα, πρέπει να μεταβιβάσετε πληροφορίες σχετικά με τη ζώνη ώρας κατά τηνΤο DataSetτο αντικείμενο που δημιουργείται στην εφαρμογή υπολογιστή-πελάτη και, στη συνέχεια, πρέπει να προσαρμόσετε τηΤο DataSetobject after it has been received in the called process on the remote computer. Για να το κάνετε αυτό, ακολουθήστε τα εξής βήματα: (Use the tools in the Windows Recovery Environment to repair Windows Vista. To do this, follow these steps:):
  1. In the Web service project on the remote computer, write code that adjusts theDateTimevalues according to the time zone of the client application. Για να το κάνετε αυτό, ακολουθήστε τα εξής βήματα: (Use the tools in the Windows Recovery Environment to repair Windows Vista. To do this, follow these steps:):
    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η ιδιότητα από τοΤο DataSetclass is used to store the Coordinated Universal Time (UTC) offset with theΤο DataSetObject. Με τοExtendedPropertiesproperty, you can store custom information with theΤο DataSetObject. If you want theΤο DataSetobject to be remoted, you must store the UTC offset as a string in theExtendedPropertiesη συλλογή.
    2. Add the following code below theAdjustDSTimeZoneΗ μέθοδος:
      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. Στο διακομιστήFILEμενού, κάντε κλικ στο κουμπίSave Allto save the application.
    4. Στο διακομιστήΔημιουργίαμενού, κάντε κλικ στο κουμπίΔημιουργία λύσεωνΓια να δημιουργήσετε την εφαρμογή.
    Για ναAdjustDateTimeValuesmethod makes the adjustment to theDateTimeObject. 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. Για να το κάνετε αυτό, ακολουθήστε τα εξής βήματα: (Use the tools in the Windows Recovery Environment to repair Windows Vista. To do this, follow these steps:):
    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. Στην Εξερεύνηση των λύσεων, αναπτύξτε όλους τους φακέλους.
    3. Κάντε δεξιό κλικ στο στοιχείοWebReference1, και στη συνέχεια κάντε κλικ στο κουμπίUpdate Web Reference.
    4. Στο διακομιστήFILEμενού, κάντε κλικ στο κουμπίSave Allto save the application.
    5. Στο διακομιστήΔημιουργίαμενού, κάντε κλικ στο κουμπίΔημιουργία λύσεωνΓια να δημιουργήσετε την εφαρμογή.
    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Το DataSetclass 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. Στο διακομιστήFILEμενού, κάντε κλικ στο κουμπίΝέα.
  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. Στο διακομιστήΕρώτημαμενού, κάντε κλικ στο κουμπίΕκτέλεσηto run the query. The MyTable table is created, and the table is updated with two values.

Δημιουργήστε μια υπηρεσία του Web

Create a Web service project on a remote computer that receives theDateTimevalues from a client application. Για να το κάνετε αυτό, ακολουθήστε τα εξής βήματα: (Use the tools in the Windows Recovery Environment to repair Windows Vista. To do this, follow these steps:):
  1. Ξεκινήστε το Microsoft Visual Studio .NET.
  2. Στο διακομιστήFILEμενού, σημείοΝέα, και στη συνέχεια κάντε κλικ στο κουμπίΤο έργο.
  3. underΤύποι έργουΚάντε κλικΤο οπτικό C# έργα, και στη συνέχεια κάντε κλικ στο κουμπίWeb του ASP.NET τ/ΥunderΠρότυπα.
  4. ΣτοNAMEπληκτρολογήστε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 theService1CLASS:
    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Το DataSetthat is passed by the client application. This method returns theDateTimevalue of the first row of the MyTable table to the client application.
  9. Στο διακομιστήFILEμενού, κάντε κλικ στο κουμπίΑποθήκευση όλωνto save the application.
  10. Στο διακομιστήΔημιουργίαμενού, κάντε κλικ στο κουμπίΔημιουργία λύσεωνΓια να δημιουργήσετε την εφαρμογή.

Δημιουργήσετε μια εφαρμογή προγράμματος-πελάτη

To create a client application that passes aΤο DataSetobject to the remote Web service, follow these steps:
  1. Ξεκινήστε το Microsoft Visual Studio .NET.
  2. Στο διακομιστήFILEμενού, σημείοΝέα, και στη συνέχεια κάντε κλικ στο κουμπίΤο έργο.
  3. underΤύποι έργουΚάντε κλικΤο οπτικό C# έργα, και στη συνέχεια κάντε κλικ στο κουμπίΚονσόλα εφαρμογώνunderΠρότυπα.
  4. ΣτοNAMEπληκτρολογήστε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. Στην Εξερεύνηση των λύσεων, κάντε δεξιό κλικΑναφορές, και στη συνέχεια κάντε κλικ στο κουμπίΠροσθήκη Web αναφοράς.
  8. ΣτοURLπληκτρολογήστεhttp://Απομακρυσμένος_διακομιστής/MyWebService/Service1.asmx, και στη συνέχεια κάντε κλικ στο κουμπίΜετάβαση. Από προεπιλογή, στο Visual Studio .NET 2002, μια αναφορά που ονομάζεται WebReference1 δημιουργείται στο Web.

    ΣΗΜΕΙΩΣΗΑπομακρυσμένος_διακομιστήςείναι ένα σύμβολο κράτησης θέσης για το όνομα του απομακρυσμένου διακομιστή όπου δημιουργείται η υπηρεσία Web.
  9. Στο Microsoft Visual Studio .NET 2003, πληκτρολογήστεWebReference1ΣτοΌνομα αναφοράς Web"Τύπος" (Type). hereWebReference1Για να ταιριάζει με τη σύνταξη κώδικα.
  10. Κάντε κλικΠροσθήκη αναφοράς.
  11. Στο διακομιστήFILEμενού, κάντε κλικ στο κουμπίΑποθήκευση όλωνΓια να αποθηκεύσετε την εφαρμογή.
  12. Στο διακομιστήΔημιουργίαμενού, κάντε κλικ στο κουμπίΔημιουργία λύσεωνΓια να δημιουργήσετε την εφαρμογή.
  13. Στο διακομιστήΟ εντοπισμός σφαλμάτωνμενού, κάντε κλικ στο κουμπίStartΓια να εκτελέσετε την εφαρμογή.
Η εφαρμογή-πελάτης τροποποιεί τη στήλη ημερομηνία/ώρα της πρώτης γραμμής. Τα σύνολα κωδικών τουDATETIMEη τιμή για την τρέχουσα ημερομηνία και ώρα της εφαρμογής-πελάτη. Περάσει έναΤο DataSetτο αντικείμενο στην υπηρεσία Web. Η υπηρεσία Web λαμβάνει τοΤο DataSetτο αντικείμενο, ανακτά την τιμή της στήλης ημερομηνία/ώρα από την πρώτη γραμμή και στη συνέχεια επιστρέφει την τιμή της εφαρμογής-πελάτη. Για ναDATETIMEη τιμή που επιστρέφεται από την υπηρεσία Web τροποποιείται σύμφωνα με τις πληροφορίες ζώνης ώρας του απομακρυσμένου διακομιστή, όπως καθορίζεται στις "Συμπτώματα" ενότητα.

Απομακρυσμένης πρόσβασης του .NET framework

Εάν η υλοποίηση των υπηρεσιών απομακρυσμένης πρόσβασης του .NET Framework στην εφαρμογή σας και δεν την κλήση μιας μεθόδου υπηρεσίας .NET Framework Web, μπορείτε να χρησιμοποιήσετε τοDataSetSurrogateη κλάση κώδικα.Για πρόσθετες πληροφορίες σχετικά με την κλάση DataSetSurrogate, κάντε κλικ στον αριθμό του άρθρου παρακάτω για να προβάλετε το άρθρο της Γνωσιακής Βάσης της Microsoft:
829740Βελτίωση των επιδόσεων σειριοποίησης και απομακρυσμένης πρόσβασης του DataSet
Για ναDataSetSurrogateη κλάση αποτρέπει τις προσαρμογές ζώνη τοπικής ώρας τις στήλες ημερομηνία/ώρα. Επίσης, αυτή η κλάση παρέχει καλύτερες επιδόσεις κατά τη διάρκεια απομακρυσμένης πρόσβασης του .NET Framework. Για ναDataSetSurrogateκλάση παρακάμπτει την προεπιλεγμένη σειριοποίηση τουΤο DataSetκλάση και serializes τοDataSetSurrogateη κλάση και των μελών της που περιλαμβάνονται σε δυαδική μορφή.

Αναφορές

Για περισσότερες πληροφορίες, επισκεφθείτε τις ακόλουθες τοποθεσίες Web Microsoft Developer Network (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 - Τελευταία αναθεώρηση: Πέμπτη, 23 Δεκεμβρίου 2010 - Αναθεώρηση: 2.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft .NET Framework 1.1
Λέξεις-κλειδιά: 
kbtshoot kbwebservices kbremoting kbclient kbsystemdata kbsqlclient kbservice kbprb kbmt KB842545 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη: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