2009-11-10 18 views
5

मैं एक आवेदन जो एसक्यूएल से डेटा पढ़ सकते हैं और एक ग्राहक अनुप्रयोग के लिए WCF के माध्यम से भेज, एक तरह से इस के समान में होता है:डेटासेट कैसे करें। डेटटाइम मानों को डेटटाइमकिंड.यूटीसी पर डिफॉल्ट करने के साथ भरें?

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

सभी दिनांक/समय UTC के रूप में डेटाबेस में संग्रहीत हैं। मैंने जो देखा वह यह है कि अगर आवेदन चलाने वाले कंप्यूटर पर घड़ी खराब हो जाती है, तो ग्राहकों द्वारा प्राप्त तिथि/समय भी कम हो जाएगा। ऐसा लगता है कि जब डेटटाइम प्रकार अनिर्दिष्ट प्रकार का होता है, तो डब्ल्यूसीएफ स्थानीय रूप से स्थानीय समय के रूप में इसका प्रतिनिधित्व करेगा, और इस तरह के रूप में भेज देगा, इसलिए आवेदन और ग्राहक के बीच किसी भी समय अंतर स्थानांतरित करने के लिए दिनांक/समय का कारण बन जाएगा।

मैं निश्चित रूप से डेटासेट के माध्यम से जा सकता हूं क्योंकि उन्हें पुनर्प्राप्त किया जाता है और दिनांक/समय फ़ील्ड को ठीक किया जाता है, लेकिन क्या कोई यहां डेटासेट भरने के लिए कुछ बेहतर तरीका सोचता है, ताकि प्रत्येक डेटटाइम फ़ील्ड स्वचालित रूप से डेटटाइमकिंड.यूटीसी पर दाफिल पर हो।()?

उत्तर

15

यदि आप SQL Server 2008 का उपयोग कर रहे हैं, तो "उचित" समाधान एसक्यूएल के डेटाटाइम के बजाय SQL datetimeoffset डेटा प्रकार का उपयोग करना है। datetimeoffset एसक्यूएल 2008 के लिए एक टाइमज़ोन-जागरूक दिनांक/समय प्रकार नया है, और इसका अनुवाद एडीओ.NET में सीएलआर System.DateTimeOffset प्रकार में किया जाएगा जो हमेशा यूटीसी के सापेक्ष है। इसके बारे में अधिक जानकारी के लिए यहां blog post है। first few search results on MSDN for DateTimeOffset अतिरिक्त पृष्ठभूमि जानकारी प्रदान करते हैं।

आप अपने एसक्यूएल स्कीमा को बदल नहीं सकते हैं, तो ADO.NET है एक संपत्ति विशेष रूप से निर्मित इस स्थिति के लिए: DataColumn.DateTimeMode, जो यह नियंत्रित जब डाटासेट धारावाहिक है (DateTimeMode=DataSetDateTime.UnspecifiedLocal, जो डिफ़ॉल्ट है) या स्थानीय समय क्षेत्र जोड़ा गया है या नहीं क्या serialization (DateTimeMode=DataSetDateTime.Unspecified) पर कोई टाइमज़ोन जानकारी नहीं जोड़ा गया है। आप उत्तरार्द्ध चाहते हैं।

यदि एमएसडीएन दस्तावेज़ों की मेरी पढ़ाई सही है, तो आपको DateTimeMode=DataSetDateTime.Unspecified को DataColumn के लिए डेटासेट भरने के बाद प्रश्न में सेट करने में सक्षम होना चाहिए। यह टाइमज़ोन के बिना कॉलम को क्रमबद्ध करना चाहिए।

आप (या मामले में दृष्टिकोण से काम नहीं होता) वास्तव में उचित होना चाहते हैं, तो आप समय की DataTable आगे बना सकते हैं और उस स्तंभ के DateTimeMode=DataSetDateTime.Utc पंक्तियों के साथ यह आईएनजी सेट Fill से पहले कर सकते हैं। फिर आपको यूटीसी के रूप में तारीख भेजने का आश्वासन दिया जाता है।

+0

"सेटसेटटाइम = डेटासेटडेटटाइम सेट करें। डेटासेट भरने के बाद प्रश्न में डेटा कॉलम के लिए निर्दिष्ट" पूरी तरह से काम किया। धन्यवाद! – galets

+0

शांत, मदद करने में खुशी हुई। –

+0

JSON- स्वरूपित दिनांक समय मानों में भेजे गए ऑफ़सेट को निकालने के लिए, 'DateTimeMode = DataSetDateTime.Utc' सेट करें। – Suncat2000