Uzak DateTime değerleri bir <a0>DataSet</a0> nesnesindeki farklı bir saat diliminde ise uzak bir bilgisayardaki eşdeğer olan yerel saate dönüştürülür..

Makale çevirileri Makale çevirileri
Makale numarası: 842545 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Bu Sayfada

Özet

Nesneyi <a0>DataSet</a0> sınıfının bir Web hizmetine ya da uzak bir Web hizmetine, geçirdiğinizde çağıran uygulama zaman bölgesinden farklı bir saat diliminde, içerdiği tablo DateTime sütunlarda eşdeğeri olan yerel saate dönüştürülür. System.Data.DataSet kodu için uzak bilgisayarın saat dilimine göre eşdeğeri olan yerel saate ayarlar nedeniyle DateTime sütunları dönüştürülür. Örneğin, bir değer 5: 00 Pasifik saati, bir istemci bilgisayardan bir Web hizmetine Doğu saati geçirilir, değeri <a0>DataSet</a0> nesnesindeki alıcı Web hizmeti yöntemi 8: 00 değişir. Bu makalede, saat dilimi bilgilerini, Web hizmetine istemci uygulamasından geçirilmesi ve bu uzak bilgisayarda DateTime sütunları ayarlayarak bu soruna geçici bir çözüm anlatılmaktadır. System.Data DataSet RESULTCLASS içeren ad boşluğu olan

Belirtiler

Bir Web hizmetine ya da uzak bir Web hizmetine bir System.Data.DataSet nesnesi geçirdiğinizde DateTime sütun değerleri değiştirin. Web hizmetinizi veya uzak bir Web hizmeti, istemci uygulaması'den farklı bir saat diliminde olduğu zaman, bu sorun oluşur. DateTime sütunlarındaki değerler için uzak bilgisayarın saat dilimine göre eşdeğeri olan yerel saate dönüştürülür.

Neden

Istemci uygulamasının saat dilimini DataSet nesne seri hale getirme sırasında saklanır. DataSet nesnesi alıcı sonunda serisi ve System.Data.DataSet kod DateTime sütunları farklı bir saat diliminde olduğu uzak bilgisayarın eşdeğeri olan yerel saate ayarlar.

Pratik Çözüm

Bu soruna geçici bir çözüm bulmak için <a0></a0>, DataSet nesnesi, istemci uygulamasında oluşturulur ve sonra uzak bilgisayarda adlı işlemindeki alındı sonra DataSet nesnesi ayarlamanız gerekir, saat dilimi bilgilerini geçmelidir. Bunu yapmak için şu adımları izleyin:
  1. Uzak bilgisayarda Web hizmeti projede DateTime değerleri için istemci uygulamasının saat dilimine göre ayarlayan bir kod yazın. Bunu yapmak için şu adımları izleyin:
    1. Içinde Service1 aşağıdaki kodu ekleyin "Web hizmeti oluşturma" bölümünde belirtildiği gibi sınıf:
      [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 yöntemi DateTime değerleri, istemci uygulamasının özgün zaman yansıtacak şekilde ayarlar. Burada ExtendedProperties özelliği <a0>DataSet</a0> sınıfının DataSet nesnesiyle Koordinatlı Evrensel Saat'e (UTC) mahsup depolamak için kullanılır. ExtendedProperties özelliğiyle, DataSet nesnesi özel bilgileri de depolayabilir. DataSet nesnesi, uzak olmasını isterseniz, bir dize içinde ExtendedProperties UTC uzaklığı depolamalısınız koleksiyonu.
    2. AdjustDSTimeZone a?a??daki kodu ekleme yöntemi:
      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. Tümünü Kaydet uygulama kaydetmek için Dosya menüsünden'ı tıklatın.
    4. Yapı) menüsünde, uygulamay? Build Solution ' ı tıklatın.
    AdjustDateTimeValues yöntemi DateTime nesnesine ayarlama yapar. Bu, belirli bir satırın DateTime sütundan özgün zaman alır ve sonra istemci uygulamasının yerel saatine göre değiştirir.
  2. Istemci uygulamasında Web hizmeti saat dilimi bilgilerini ayarlanmış doğrulayan kod yazın. Bunu yapmak için şu adımları izleyin:
    1. Ana aşağıdaki kodu ekleyin "bir istemci uygulamasını oluşturma" bölümünde belirtilen kodundan sonra işlev:
      str=myDatasetService.AdjustDSTimeZone(myDataset );
      Console.WriteLine (str);
      Console.ReadLine ();
    2. Solution Explorer'da tüm klasörleri'ni genişletin.
    3. WebReference1 ' ı sağ tıklatın ve sonra Güncelleştirme Web başvuru ' yu tıklatın.
    4. Tümünü Kaydet uygulama kaydetmek için Dosya menüsünden'ı tıklatın.
    5. Yapı) menüsünde, uygulamay? Build Solution ' ı tıklatın.
    6. Hata Ayıkla) menüsünde, uygulamayı çalıştırmak için Başlat ' ı tıklatın.
Istemci uygulaması bir DateTime sütunu Tablom tablosuna bağlar. Web hizmetinin bir nesne oluşturur ve nesneyi <a0>DataSet</a0> sınıfının Web AdjustDSTimeZone yöntemine geçirmeden hizmet. Web hizmeti yöntemi AdjustDSTimeZone DateTime güncelleştirir Tablom sütunu Tablom tablonun ilk satırının DateTime değeri verir ve istemci uygulamasına göre saat dilimini tablo. Istemci uygulaması tarafından alınan DateTime Web'e istemci uygulama tarafından geçirilen bir değerle aynı değerdir hizmet.

Durum

Bu davranış tasarım yüzündendir.

Daha fazla bilgi

Sorunu Yeniden Oluşturma Adımları

Bir veritabanı tablosu oluşturma

Bir veritabanı tablosu, Microsoft SQL örneği oluşturmak için sunucu, aşağıdaki adımları izleyin:
  1. SQL Query Analyzer'ı başlatın.
  2. Dosya menüsünde Yeni'yi tıklatın.
  3. Boş bir sorgu penceresi ' ı tıklatın ve sonra Tamam ' ı tıklatın.
  4. Aşağıdaki kodu, Sorgu penceresinde yapıştırın. Bu kod Tablom tabloyu. oluşturur
    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. Sorgu) menüsünde, sorguyu çalıştırmak için Execute ' ı tıklatın. Tablom tablosu oluşturulur ve tablonun iki değerlerle güncelleştirilir.

Bir Web hizmetini oluşturma

Bir istemci uygulamasını DateTime değerleri alır, uzaktaki bir bilgisayarda bulunan bir Web hizmeti projesi oluşturun. Bunu yapmak için şu adımları izleyin:
  1. Microsoft Visual Studio .NET'i başlatın.
  2. Dosya menüsünde Yeni ' nin üzerine gelin ve sonra Project ' i tıklatın.
  3. Altında Project Types, Visual C# Projects ' ı tıklatın ve sonra şablonları altında ASP.NET Web Service ' ı tıklatın.
  4. Adı kutusuna, MyWebService yazın ve Tamam ' ı tıklatın. Varsayılan olarak, Service1.asmx dosyası oluşturulur.
  5. Solution Explorer'da (Çözüm Gezgini), Service1.asmx dosyasını sağ tıklatın ve Kod Görüntüle</a1>'ı tıklatın.
  6. Dosyanın başına aşağıdaki kodu ekleyin:
    using System.Data.SqlClient;
    using System.Timers;
  7. Aşağıdaki kodu içinde Service1 bulun sınıf:
    public class Service1 : System.Web.Services.WebService
    {
  8. 7. Adımda bulduğunuz kodundan sonra aşağıdaki kodu ekleyin:
    [WebMethod]
    public String DataSetReturn( DataSet clientDataSet )
    {
      string str;				
      str=clientDataSet.Tables["MyTable"].Rows[0][1].ToString() ;
      return str;	
    }
    DataSetReturn yöntemi, nesne istemci uygulama tarafından geçirilen DataSet alır. Bu yöntem <a0>Tablom</a0> tablonun ilk satırının DateTime değeri istemci uygulamasına döndürür.
  9. Tümünü Kaydet uygulama kaydetmek için Dosya menüsünden'ı tıklatın.
  10. Yapı) menüsünde tıklatın Build Solution uygulama oluşturmak için.

Bir istemci uygulaması oluşturun.

Uzak Web hizmeti için bir DataSet nesnesi geçirmeden bir istemci uygulaması oluşturmak için aşağıdaki adımları izleyin:
  1. Microsoft Visual Studio .NET'i başlatın.
  2. Dosya menüsünde Yeni ' nin üzerine gelin ve sonra Project ' i tıklatın.
  3. Altında Project Types, Visual C# Projects ' ı tıklatın ve şablonları altında Console Application ' ı tıklatın.
  4. Adı kutusuna, MyDataSet yazın ve Tamam ' ı tıklatın. Varsayılan olarak, Class1.cs dosyası oluşturulur.
  5. Dosyanın başına aşağıdaki kodu ekleyin:
    using System.Data;
    using System.Data.SqlClient;
    using System.Timers;
    using System.Diagnostics;
  6. Ana aşağıdaki kodu ekleyin işlevi:
    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 ();
    
    Not Tablom erişmek için tablo, sunucu bilgilerini ve kullanıcı adı ve parola, Microsoft SQL Server ile bağlantı kurmak için veritabanı bilgisini değiştirmeniz gerekir.
  7. Solution Explorer'da (Çözüm Gezgini), Başvurular ' ı sağ tıklatın ve sonra Add Web Reference</a1>'ı tıklatın.
  8. URL kutusuna http:// RemoteServer /MyWebService/Service1.asmx yazın ve sonra da <a2>Git</a2>'i tıklatın. Varsayılan olarak Visual Studio .NET 2002, Web WebReference1 adlı başvurusu oluşturulur.

    NotRemoteServer oluşturulduğu Web hizmetinin bir uzak sunucu adı için bir yer tutucudur.
  9. Microsoft Visual Studio .NET 2003'te Web başvuru adıWebReference1 yazın kutusunu. Burada WebReference1 kod sözdizimini eşleştirmek için kullanılır.
  10. Başvuru Ekle ' yi tıklatın.
  11. Tümünü Kaydet uygulama kaydetmek için Dosya menüsünden'ı tıklatın.
  12. Yapı) menüsünde tıklatın Build Solution uygulama oluşturmak için.
  13. Hata Ayıkla) menüsünde, uygulamayı çalıştırmak için Başlat ' ı tıklatın.
Istemci uygulaması, ilk satırın DateTime sütunu değiştirir. Bu kod, geçerli tarih ve zamanı istemci uygulamasının DateTime değeri ayarlar. Bir DataSet nesnesi, Web hizmetine geçirir. Web hizmeti DataSet nesnesi alır, ilk satırdan DateTime sütununun değerini alır ve sonra istemci uygulamasına geri alan değeri geri döndürür. Web hizmeti tarafından döndürülen DateTime değeri değiştiğinde bilgilere göre saat dilimini uzak sunucunun olarak belirtilen "Belirtiler" bölümü.

.NET framework remoting

.NET Framework remoting Hizmetleri uygulamanızda uygulama ve .NET Framework Web hizmeti yöntem çağrısı, DataSetSurrogate sınıf kodunu kullanabilirsiniz.DataSetSurrogate sınıfı hakkında ek bilgi için Microsoft Knowledge Base'deki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
829740DataSet seri hale getirme ve uzak performansını iyileştirme
DataSetSurrogate sınıfı DateTime sütunlarda yerel saat dilimi ayarlamaları engeller. Bu sınıf, .NET Framework remoting sırasında daha iyi performans da sağlar. DataSetSurrogate sınıfı varsayılan seri hale getirme <a0>DataSet</a0> sınıfının geçersiz kılar ve DataSetSurrogate sınıfı ve içerdiği üyelerine ikili biçimde serializes.

Referanslar

Daha fazla bilgi için aşağıdaki Microsoft Developer Network (MSDN) Web sitelerini ziyaret edin:
System.Data.SqlClient ad
http://msdn2.microsoft.com/en-us/library/system.data.sqlclient(vs.71).aspx
DataSet.ExtendedProperties özelliği
http://msdn2.microsoft.com/en-us/library/system.data.dataset.extendedproperties(vs.71).aspx

Özellikler

Makale numarası: 842545 - Last Review: 18 Mayıs 2007 Cuma - Gözden geçirme: 1.5
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0
Anahtar Kelimeler: 
kbmt kbtshoot kbwebservices kbremoting kbclient kbsystemdata kbsqlclient kbservice kbprb KB842545 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:842545

Geri Bildirim Ver

 

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