2009-11-10 12 views
5

mam aplikację, która będzie odczytywać dane z SQL i wysłać go poprzez WCF do aplikacji klienckiej, w sposób podobny do tego:How to DataSet.Fill z wartościami DateTime domyślnie DateTimeKind.Utc?

SqlDataAdapter da = new SqlDataAdapter(cmd) 
DataSet ds = new DataSet(); 
da.Fill(ds); 
return ds; 

All data/czas są przechowywane w bazie danych jako UTC. Zauważyłem, że jeśli zegar na komputerze, na którym działa aplikacja, jest zniekształcony, to data/czas otrzymany przez klientów będzie również zniekształcona. Wydaje się, że w przypadku, gdy typ DateTime ma nieokreślony rodzaj, WCF będzie go reprezentował jako czas lokalny wewnętrznie i wysyłał jako taki, więc każda różnica czasu między aplikacją a klientem spowoduje zmianę daty/godziny.

Mogę z pewnością przechodzić przez zestawy danych podczas ich pobierania i poprawiania pól daty/czasu, ale czy ktokolwiek tutaj pomyśli o lepszym sposobie wypełniania zestawu danych, tak, że każde pole DateTime będzie automatycznie DateTimeKind.Utc na da.Fill()?

Odpowiedz

15

Jeśli używasz programu SQL Server 2008, "poprawnym" rozwiązaniem jest użycie typu danych SQL datetimeoffset zamiast datetime SQL. datetimeoffset to typ daty/czasu uwzględniający strefy czasowe, nowy w SQL 2008 i zostanie przetłumaczony na ADO.NET na typ CLR System.DateTimeOffset, który zawsze jest względny w stosunku do czasu UTC. Oto blog post wchodząc w szczegóły na ten temat. Numer first few search results on MSDN for DateTimeOffset zawiera dodatkowe informacje dodatkowe.

Jeśli nie można zmienić schemat SQL, ADO.NET ma właściwość zamówienie na taką sytuację: DataColumn.DateTimeMode, który kontroluje, czy lokalna strefa czasowa jest dodawana, gdy zestawu danych jest seryjny (DateTimeMode=DataSetDateTime.UnspecifiedLocal, co jest domyślne) lub czy informacje o strefie czasowej nie zostaną dodane do serializacji (DateTimeMode=DataSetDateTime.Unspecified). Chcesz tego drugiego.

Jeśli moje czytanie dokumentów MSDN jest poprawne, powinieneś być w stanie ustawić DateTimeMode=DataSetDateTime.Unspecified dla danego DataColumn po wypełnieniu DataSet. To powinno serializować kolumnę bez strefy czasowej.

Jeśli chcesz być naprawdę poprawny (lub w przypadku, gdy powyższe podejście nie działa), możesz wcześniej utworzyć DataTable i ustawić tę kolumnę jako DateTimeMode=DataSetDateTime.Utc przed wierszami. Wtedy masz pewność, że wysłałeś datę jako UTC.

+0

"Ustaw DateTimeMode = DataSetDateTime.Unspecified dla danej kolumny DataColumn po wypełnieniu DataSet" działało idealnie. Dzięki! – galets

+0

fajne, chętnie pomoże. –

+0

Aby usunąć przesunięcie wysłane w wartości DateTime sformatowanej w formacie JSON, ustaw opcję "DateTimeMode = DataSetDateTime.Utc". – Suncat2000

Powiązane problemy