15

हमारे पास Linq-to-SQL के साथ वास्तव में अजीब और असंगत व्यवहार है।लिंक-टू-एसक्यूएल और डेटटाइम अजीबता

हमारा आवेदन कुछ ग्राहकों की साइटों पर स्थापित है, और यह अधिकांश भाग के लिए ठीक काम करता है। लिंक-टू-एसक्यूएल में से एक प्रश्न एक तालिका अद्यतन करता है और DateTime कॉलम को एक नए मान पर सेट करता है।

सभी मामलों में - - हमारे विकास और परीक्षण प्रणाली सहित इस Linq करने वाली एसक्यूएल बयान की तर्ज पर कुछ में अनुवाद किया जाता है:

UPDATE dbo.OurTable 
SET WorkTimeStamp = @WTS 
WHERE ID = @ID 

@WTS = '2011-11-04 14:15:25', @ID = 555 

हालांकि, एक ग्राहक की साइट पर, कारण है कि नहीं कर रहे के लिए 'टी हमें (अभी तक) के लिए स्पष्ट, इस अद्यतन में अनुवाद किया जाता है:

UPDATE dbo.OurTable 
SET WorkTimeStamp = @WTS 
WHERE ID = @ID 

@WTS = 'Nov 4 2011 02:15:25PM', @ID = 555 

और किसी कारण से तो SQL Server 2005 पर विफल रहता है।

अब, उस ग्राहक के सर्वर (वेब ​​सर्वर और SQL सर्वर) में Windows Server 2008 के यूएस-अंग्रेज़ी संस्करण स्थापित हैं; SQL सर्वर में भाषा us_english पर सेट है, दिनांक प्रारूप mdy पर सेट किया गया है, अद्यतन करने वाले उपयोगकर्ता खाते में SQL Server में English पर अपनी भाषा सेट है ..... और यह सेटअप वही है (उदाहरण के लिए, हमारे परीक्षण सर्वर बुनियादी ढांचे)।

तो मेरे सवाल का सच है:

  1. क्यों पृथ्वी पर करता है Linq करने वाली एसक्यूएल अचानक ही DateTime की एक पूरी तरह से अलग प्रतिनिधित्व एसक्यूएल सर्वर को भेजने के लिए बनाने के? क्या इसे नियंत्रित करने के लिए कोई घुंडी है?

  2. और ADO.NET और SQL Server 2005 SP2 डेटाबेस क्यों नहीं UPDATE कथन सही तरीके से संभाल सकता है? - SqlDateTime अतिप्रवाह

SqlTypeException: हम अपने लॉग में ऐसी त्रुटि हो रही है। 1/1/1753 12:00:00 पूर्वाह्न और 12/31/9999 11:59:59 अपराह्न के बीच होना चाहिए।

यह एक नेट त्रुटि (एक एसक्यूएल सर्वर त्रुटि से अधिक) हो रहा है और ऐसा लगता है जैसे कि नेट वास्तव में उस Nov 4 2011 02:15:25PM किसी कारण के लिए एक वैध DateTime के रूप में व्याख्या नहीं कर सकते हैं। कुछ आगे की जांच पड़ताल Linq- में इंगित करता है:

अद्यतन UPDATE खुशी से बस ठीक काम करता है ..... - जब SQL Server Management Studio में उत्पन्न अद्यतन बयान चलाने का प्रयास है, हम उस त्रुटि होने की "मजबूर" नहीं कर पा रहे टू-एसक्यूएल अलग ढंग से व्यवहार करने के तरीके SQL सर्वर 2005 या 2008.

  • SQL सर्वर के साथ के खिलाफ जा रहा , हमारे दिनांकों में बदल गया हो: SQL सर्वर के साथ Nov 4 2011 02:15:25PM
  • , हमारी तिथियां बदल दी गई हैं: 2011-11-04 02:15:25PM
+0

कृपया सी #/वीबी.नेट ऐप के लिए अपनी वर्तमान संस्कृति रिपोर्ट की जांच करें। –

+0

@ बोगदान साहलियन: 'वर्तमान संस्कृति' सभी प्रणालियों पर 'InvariantCulture' पर सेट है –

+0

मुझे लगता है कि यह एक .NET मुद्दा है और SQL नहीं है। शायद LINQ2SQL में एक बग कहीं भी परिवर्तनीय संस्कृति का उपयोग करने के लिए भूल जाते हैं। क्या विंडोज स्थान सेटिंग्स मेल खाते हैं? – leppie

उत्तर

3

मुझे लगता है कि आप गलत समस्या का पीछा कर सकते हैं।

मैं पहली बार की जाँच करेगा:

  1. आपका LINQ to SQL स्कीमा/डेटाबेस मॉडल सटीक है।
  2. आपकी समस्या यह सुनिश्चित करने के लिए तर्क देती है कि नया डेटटाइम मान सीमा से बाहर नहीं हो सकता है। विशेष रूप से, जांचें कि यह DateTime.MinValue या DateTime.MaxValue नहीं हो सकता है।
  3. कि आप अपने आवेदन में तारीख को पार्सिंग करने के लिए कोई स्ट्रिंग नहीं कर रहे हैं।
  4. एसक्यूएल सर्वर   किसी भी चलाता (विशेष रूप से के बजाय चलाता है, जो अद्यतन बयान को संशोधित किया जा सकता है) नहीं है यही कारण है कि।

मैं आपको (या आपके ग्राहक) को 'SqlTypeException - SqlDateTime ओवरफ़्लो प्राप्त करके शुरू कर रहा हूं। 1/1/1753 12:00:00 पूर्वाह्न और 12/31/9999 11:59:59 अपराह्न के बीच होना चाहिए 'त्रुटि संदेश और जांच पर आपने दिनांकों को प्रदर्शित करने के तरीके में अंतर देखा।

आप जानकारी कहां से आ रहा है, तो मैं एसक्यूएल प्रोफाइलर की तरह कुछ संभालने का उल्लेख नहीं है।

हालांकि तारीख प्रदर्शन मुद्दे को एक लाल हेरिंग हो सकता है के रूप में यह एक समस्या नहीं होनी चाहिए।

SQL सर्वर 2005 के साथ

, हमारे दिनांकों में बदल गया हो: 2011-11-04 02:15:25: नवम्बर 4 2011 02:15:25

एसक्यूएल सर्वर 2008 के साथ

, हमारे दिनांकों में बदल गया हो

मुझे यकीन नहीं है कि आप इसका क्या मतलब रखते हैं। एसक्यूएल 'टर्न' स्ट्रिंग में दिनांक है क्योंकि यह तारों को तारों के रूप में संग्रहीत नहीं करता है, लेकिन आंतरिक प्रतिनिधित्व एक संख्या है (कुछ 1 जनवरी 1 9 00 से दिनों की संख्या की तरह)।

यदि आपका मतलब है कि आपकी तिथियां को 4 नवंबर 2011 02:15:25 अपराह्न के रूप में प्रदर्शित की गई हैं, तो यह जानकारी प्रदर्शित करने वाले कार्यक्रम पर निर्भर है।

इसके अलावा, जैसा कि मैं इसे समझता हूं, यदि आप डेटटाइम पैरामीटर का उपयोग कर रहे हैं (जो LINQ   से   एसक्यूएल डेटाबेस मॉडल सटीक होने पर किया जाना चाहिए), तो क्लाइंट से SQL सर्वर पर भेजी गई जानकारी है डेटटाइम का एसक्यूएल संख्यात्मक प्रतिनिधित्व। यह क्लाइंट और सर्वर के बीच किसी भी डेटाटाइम रूपांतरण मुद्दों से बचना चाहिए। जब आप देखते हैं, उदाहरण के लिए, एसक्यूएल प्रोफाइलर, यह आपको तारीख का संख्यात्मक प्रतिनिधित्व नहीं दिखाता है, जिसका अर्थ अधिकांश लोगों के लिए बहुत कम होगा, लेकिन सहायक होने का प्रयास करता है और मूल्य को स्ट्रिंग के रूप में प्रदर्शित करता है।

महत्वपूर्ण बात यह है कि यदि SQL या SQL प्रोफाइलर '4 नवंबर 2011 02:15:25 अपराह्न' के रूप में डेटाटाइम पैरामीटर प्रदर्शित करने का प्रबंधन करता है तो यह जानता है कि यह एक वैध तिथि है, और यह वास्तव में जानता है कि कौन सी तारीख है।

तो मुझे लगता है यह होगा कि प्रदर्शन स्वरूप मुद्दा शायद अप्रासंगिक है।

यही तो क्यों अपने ग्राहक SqlTypeException हो रही है के रूप में सवाल छोड़ - SqlDateTime अतिप्रवाह त्रुटि संदेश।

करने के लिए पहली बात यह है कि क्या दिनांक मान आप सेट कर रहे हैं, जो आवेदन के स्तर पर किया जाना और SQL सर्वर सर्वर पर नहीं है, क्योंकि यह है कि अब तक प्राप्त नहीं होता की जरूरत है की जांच करने के लिए है।(इस कारण से भी मुझे नहीं लगता कि यह किसी SQL कॉन्फ़िगरेशन समस्या है है।)

यह रूप में अगर नेट वास्तव में व्याख्या नहीं कर सकते लगता है कि नवंबर 4 2011 किसी कारण के लिए एक वैध दिनांक समय के रूप में 02:15:25

मैं नहीं दिख रहा है जहां .NET भी तारीख के रूप में तार व्याख्या करने के लिए जब तक आप कुछ DateTime.Parse आदेशों है की कोशिश कर रहा हो सकता है और यदि यह मामला है, तो समस्या या तो LINQ या SQL के साथ कोई संबंध नहीं है।

+0

(2) डेटटाइम 'डेटटाइम.अब.एडमिन्यूट्स (5)' जैसे कुछ पर सेट है, इसलिए मुझे पूरा यकीन है कि यह "सीमा से बाहर नहीं है" –

+0

वह कह रहा है कि .NET दिनांक को उपयोग के लिए स्ट्रिंग प्रस्तुति में बदल देता है अद्यतन क्वेरी, नहीं कि एसक्यूएल इसे एक स्ट्रिंग में बदल देता है। और, कि .NET 2008 से SQL 2005 के लिए दिनांक स्ट्रिंग का एक अलग प्रारूप जारी कर रहा है, और SQL 2005 क्वेरी को समझ नहीं रहा है क्योंकि प्रारूप कुछ समझ में नहीं आता है। –

+0

@marc_s मुझे पता है कि यह असंभव है, लेकिन क्या कोई मौका है डेटटाइम.अब सीमा से बाहर हो सकता है, यानी कंप्यूटर/सर्वर की तारीख गलत है? – sgmoore

संबंधित मुद्दे