Vzdálený hodnoty DateTime v objektu DataSet jsou převedeny na ekvivalentní místní čas vzdáleného počítače, který je v jiném časovém pásmu

Překlady článku Překlady článku
ID článku: 842545 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Souhrn

Při předání objekt třídy DataSet vzdálené webové služby nebo webové službě, která je v časovém pásmu se liší od časového pásma volající aplikace, DateTime sloupce obsažené tabulky jsou převedeny na ekvivalentní místní čas. DateTime sloupců jsou převedeny, protože kód System.Data.DataSet upraví ekvivalentní místní čas podle časového pásma vzdáleného počítače. Například pokud hodnota 5: 00 je předán z klientského počítače v Tichomoří webové služby v východ, hodnota v objektu DataSet změní na 8: 00 v přijímací metody webové služby. Tento článek popisuje tento problém vyřešit předáním časové pásmo informace z aplikace klienta webové služby a úpravou sloupců DateTime ve vzdáleném počítači. Obor názvů obsahující DataSet class. je System.data

Příznaky

Hodnoty DateTime sloupce změnit při předání System.Data.DataSet objekt webové služby nebo vzdálené webové služby. K tomuto problému dochází v případě webové služby nebo vzdálené webové služby je v jiném časovém pásmu než klientské aplikace. Hodnoty ve sloupcích DateTime jsou převedeny na ekvivalentní místní čas podle časového pásma vzdáleného počítače.

Příčina

Časové pásmo klientské aplikace uloženy během serializace objektu DataSet. Objekt DataSet rekonstruován na přijímajícím konci a kód System.Data.DataSet upraví DateTime sloupců na ekvivalentní místní čas vzdáleného počítače, který je v jiném časovém pásmu.

Jak potíže obejít

Chcete-li tento problém vyřešit, musí předání informací o zóně čas při vytvořen objekt DataSet v klientské aplikaci a potom musí upravit objekt DataSet po přijetí ve vzdáleném počítači volané procesu. Postupujte takto:
  1. V projektu webové služby ve vzdáleném počítači napsat kód upraví hodnoty DateTime podle časového pásma klientské aplikace. Postupujte takto:
    1. Přidejte následující kód v Service1 třídy určený v části "Vytvoření webové služby":
      [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;
      }
      
      Metoda AdjustDSTimeZone upraví hodnoty DateTime, aby odrážel původní čas klientské aplikace. Zde ExtendedProperties vlastnost třídy DataSet slouží k ukládání posun UTC (Coordinated Universal Time) s objektu DataSet. Vlastnost ExtendedProperties můžete ukládat vlastní informace s objektu DataSet. Pokud chcete objekt DataSet být vzdálený ČASOVÝ posun musí ukládat jako řetězec v ExtendedProperties kolekce.
    2. Přidejte následující kód pod AdjustDSTimeZone metoda:
      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. V nabídce soubor klepněte na tlačítko Uložit vše uložit aplikace.
    4. V nabídce vytvořit klepněte na tlačítko Sestavit řešení sestavení aplikace.
    Metoda AdjustDateTimeValues provede úpravu objektu DateTime. Získá původní čas ze sloupce DateTime určitý řádek a upravuje podle místního času klientské aplikace.
  2. V klientské aplikaci zapisovat kód, který ověřuje, že webová služba má upravena informace časové pásmo. Postupujte takto:
    1. Přidejte následující kód v hlavní funkce po kódu je zadána v části "Vytvoření aplikace klient":
      str=myDatasetService.AdjustDSTimeZone(myDataset );
      Console.WriteLine (str);
      Console.ReadLine ();
    2. V aplikaci Solution Explorer rozbalte všechny složky.
    3. WebReference1 klepněte pravým tlačítkem myši a potom klepněte na tlačítko Aktualizovat webový odkaz.
    4. V nabídce soubor klepněte na tlačítko Uložit vše uložit aplikace.
    5. V nabídce vytvořit klepněte na tlačítko Sestavit řešení sestavení aplikace.
    6. V nabídce Debug klepněte na tlačítko Start spustit aplikaci.
Klientská aplikace připojí MojeTabulka tabulku obsahující sloupec DateTime. Vytvoří objekt webové služby a předá objekt třídy DataSetAdjustDSTimeZone metoda na webu služby. Metoda AdjustDSTimeZone ve webové službě, aktualizuje DateTime sloupec MojeTabulka tabulky podle časové pásmo klientskou aplikací a potom vrátí hodnotu DateTime první řádek tabulky MojeTabulka. Hodnota DateTime přijaté aplikace klienta je stejná jako hodnota je předán klientské aplikace na webu služby.

Prohlášení

Toto chování je záměrné.

Další informace

Postup reprodukce problému

Vytvořit tabulku databáze

Vytvořit tabulku databáze v instanci Microsoft SQL Server, postupujte takto:
  1. Spusťte nástroj SQL Query Analyzer.
  2. V nabídce soubor klepněte na tlačítko Nový.
  3. Klepněte na Prázdné okno dotazu a potom klepněte na tlačítko OK.
  4. Vložte následující kód v okně dotazu. Tento kód vytvoří tabulku MojeTabulka.
    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. V nabídce dotaz klepněte na tlačítko Spustit spuštění dotazu. Tabulka vytvořena tabulka a tabulka je aktualizován dvě hodnoty.

Vytvořit webové služby

Vytvořit web projektu služby ve vzdáleném počítači z aplikace klienta obdrží hodnoty DateTime. Postupujte takto:
  1. Spusťte aplikaci Visual Studio .NET.
  2. V nabídce soubor přejděte na příkaz Nový a klepněte na příkaz projekt.
  3. V části Typy projektu klepněte na položku Visual C# projekty a klepněte na tlačítko Webové služby ASP.NET v části šablony.
  4. V poli název zadejte MyWebService a potom klepněte na tlačítko OK. Ve výchozím nastavení je vytvořen soubor Service1.asmx.
  5. V aplikaci Solution Explorer klepněte pravým tlačítkem myši na soubor Service1.asmx a potom klepněte na tlačítko Zobrazit kód.
  6. Na začátku souboru přidejte následující kód:
    using System.Data.SqlClient;
    using System.Timers;
  7. Vyhledejte následující kód v Service1 třídy:
    public class Service1 : System.Web.Services.WebService
    {
  8. Přidejte následující kód po kódu vyhledaného v kroku 7:
    [WebMethod]
    public String DataSetReturn( DataSet clientDataSet )
    {
      string str;				
      str=clientDataSet.Tables["MyTable"].Rows[0][1].ToString() ;
      return str;	
    }
    metodu DataSetReturn obdrží objektu DataSet je předán klientské aplikace. Tato metoda vrátí hodnotu DateTime první řádek tabulky MojeTabulka klientské aplikace.
  9. V nabídce soubor klepněte na tlačítko Uložit vše uložit aplikace.
  10. V nabídce vytvořit klepněte na příkaz Sestavit řešení k sestavení aplikace.

Vytvoření aplikace klient

Vytvořit klientská aplikace, která předává objekt DataSet vzdálené webové služby, postupujte takto:
  1. Spusťte aplikaci Visual Studio .NET.
  2. V nabídce soubor přejděte na příkaz Nový a klepněte na příkaz projekt.
  3. V části Typy projektu klepněte na položku Visual C# projekty a klepněte na tlačítko Aplikace konzoly v části šablony.
  4. V poli název zadejte MyDataSet a potom klepněte na tlačítko OK. Ve výchozím nastavení je vytvořen soubor Class1.cs.
  5. Na začátku souboru přidejte následující kód:
    using System.Data;
    using System.Data.SqlClient;
    using System.Timers;
    using System.Diagnostics;
  6. Přidejte následující kód v hlavní funkce:
    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 ();
    
    Poznámka pro přístup MojeTabulka tabulky, musíte upravit informace o serveru a informace databáze společně s uživatelské jméno a heslo pro navázání připojení s Microsoft SQL Server.
  7. V aplikaci Solution Explorer klepněte pravým tlačítkem myši odkazy a potom klepněte na tlačítko Přidat webový odkaz.
  8. Do pole URL zadejte http:// RemoteServer /MyWebService/Service1.asmx a klepněte na tlačítko Přejít. Výchozí Visual Studio .NET 2002, web je vytvořen odkaz s názvem WebReference1.

    Poznámka:RemoteServer je zástupný název vzdáleného serveru, kde je vytvořena webová služba.
  9. Microsoft Visual Studio .NET 2003, zadejte WebReference1název webového odkazu pole. Zde WebReference1 používána pro párování syntaxe kódu.
  10. Klepněte na tlačítko Přidat odkaz.
  11. V nabídce soubor klepněte na tlačítko Uložit vše uložit aplikace.
  12. V nabídce vytvořit klepněte na příkaz Sestavit řešení k sestavení aplikace.
  13. V nabídce Debug klepněte na tlačítko Start spustit aplikaci.
Klientská aplikace upraví sloupec DateTime první řádek. Kód nastaví hodnotu DateTime aktuální datum a čas klientské aplikace. Objekt DataSet předá webové služby. Webová služba přijímá objekt DataSet, načte hodnotu DateTime sloupec z prvního řádku a vrátí hodnotu do klientské aplikace. Je změněna hodnota DateTime, která je vrácena webové služby podle informací časové pásmo vzdálený server jako zadaný v "příznaky" o oddílu.

Vzdálená komunikace rozhraní .NET framework

Pokud jsou implementaci služeb .NET Framework vzdálené komunikace v aplikaci a zavoláte metodu .NET Framework webové služby, můžete použít kód třídy DataSetSurrogate.Další informace o DataSetSurrogate třídy klepněte na následující číslo článku databáze Microsoft Knowledge Base:
829740Zlepšení výkonu DataSet serializace a vzdálené komunikace
Třída DataSetSurrogate zabraňuje úprav zónu místního času na sloupce DateTime. Tato třída také poskytuje lepší výkon během vzdálené komunikace .NET Framework. Třída DataSetSurrogate přepíše výchozí serializace třídy DataSet a řadí DataSetSurrogate třídy a jeho členů obsažené v binárním formátu.

Odkazy

Další informace navštivte následující webové servery Microsoft Developer Network (MSDN):
System.data.SqlClient oboru názvů
http://msdn2.microsoft.com/en-us/library/system.data.sqlclient(vs.71).aspx
DataSet.ExtendedProperties vlastnost
http://msdn2.microsoft.com/en-us/library/system.data.dataset.extendedproperties(vs.71).aspx

Vlastnosti

ID článku: 842545 - Poslední aktualizace: 18. května 2007 - Revize: 1.5
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0
Klíčová slova: 
kbmt kbtshoot kbwebservices kbremoting kbclient kbsystemdata kbsqlclient kbservice kbprb KB842545 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:842545

Dejte nám zpětnou vazbu

 

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