त्रुटि - SqlDateTime अतिप्रवाह। 1/1/1753 12:00:00 AM और 12/31/9999 11:59:59 PM के बीच होना चाहिए


82

मैं इस कोड के टुकड़े का उपयोग कर रहा हूं जो मैंने लिखा है और यह इस सबसे अस्पष्ट तरीके से काम कर रहा है। मैं डेटाबेस में एक पंक्ति सम्मिलित करना चाहता हूं जिसमें DateTime के दो कॉलम शामिल हैं:

myrow.ApprovalDate = DateTime.Now
myrow.ProposedDate = DateTime.Now

और फिर भी, जब मैं डेटाबेस को अपडेट करता हूं तो मुझे यह त्रुटि मिलती है:

SqlDateTime ओवरफ़्लो। 1/1/1753 12:00:00 AM और 12/31/9999 11:59:59 PM के बीच होना चाहिए।

मैंने डेटाबेस से एक सम्मिलित मूल्य और हार्ड कोड को अद्यतन किए जाने वाले ऑब्जेक्ट में कॉपी करने की भी कोशिश की है:

// I copied this value from the DB
myrow.ApprovalDate =  Convert.ToDateTime("2008-12-24 00:00:00.000");

अभी भी एक ही त्रुटि है, अजीब बात यह है कि उपरोक्त चाल ने डीबी के लिए पहली प्रविष्टि के लिए काम किया, लेकिन वहां से विफल रहा। किसी भी विचार क्या चल रहा है?


अपना कोड पोस्ट करें। इसके अलावा, आप सिर्फ निरीक्षण कर सकते हैं कि लिनेक कवर के नीचे क्या बना रहा है।
NotMe

जवाबों:


87

DateTime सी # में एक मान प्रकार, नहीं एक संदर्भ प्रकार है, और इसलिए खाली नहीं रह सकती। यह हालांकि स्थिर हो सकता है DateTime.MinValueजो Sql Servers DATETIMEडेटा प्रकार की सीमा के बाहर है ।

मूल्य प्रकारों की गारंटी हमेशा (डिफ़ॉल्ट) मान (शून्य की) होती है, जिन्हें हमेशा स्पष्ट रूप से सेट करने की आवश्यकता नहीं होती है (इस स्थिति में DateTime.MinValue)।

निष्कर्ष यह है कि संभवतः आपके पास एक परेशान करने वाला दिनांक समय मान है जिसे आप डेटाबेस में पास करने का प्रयास कर रहे हैं।

DateTime.MinValue = 1/1/0001 12:00:00 AM
DateTime.MaxValue = 23:59:59.9999999, December 31, 9999, 
                    exactly one 100-nanosecond tick 
                    before 00:00:00, January 1, 10000

MSDN: DateTime.MinValue


Sql सर्वर के बारे में

दिनांक और समय
जनवरी, 1753 से 31 दिसंबर, 9999 तक का डेटटाइम और समय का डेटा, एक सेकंड के तीन-सौवें (3.33 मिलीसेकंड या 0.00333 सेकंड के बराबर) की सटीकता के लिए। मानों को .000, .003, या .007 सेकंड की वेतन वृद्धि के लिए गोल किया जाता है

smalldatetime
दिनांक 1 जनवरी, 1900 से 6 जून, 2079 तक मिनट की सटीकता के साथ समय और डेटा। 29.998 सेकंड या उससे कम वाले स्माटलैडटाइम मान निकटतम मिनट तक गोल होते हैं; 29.999 सेकंड या उससे अधिक के मान को निकटतम मिनट तक गोल किया जाता है।

MSDN: Sql Server DateTime और SmallDateTime


अंत में, यदि आप अपने आप को C # DateTimeको एक स्ट्रिंग से sql में पास करते हुए पाते हैं, तो आपको अधिकतम सटीकता बनाए रखने और SQL सर्वर को एक समान त्रुटि को रोकने के लिए इसे निम्नानुसार प्रारूपित करने की आवश्यकता है।

string sqlTimeAsString = myDateTime.ToString("yyyy-MM-ddTHH:mm:ss.fff");

अद्यतन (8 साल बाद)

Sql DateTime2डेटाटाइप का उपयोग करने पर विचार करें जो DateTimeदिनांक सीमा 0001-01-01 through 9999-12-31और समय सीमा के साथ .net के साथ बेहतर संरेखित करता है00:00:00 through 23:59:59.9999999

string dateTime2String = myDateTime.ToString("yyyy-MM-ddTHH:mm:ss.fffffff");

MSDN डेटाइम 2 (Transact-SQL)


6
DateTimeसी # में अशक्त नहीं होने के बारे में सूचक के लिए धन्यवाद !
टॉमस एशचन

80

मैं कई डीबी संबंधित त्रुटियों के बाद एसक्यूएल मिनट / अधिकतम तिथियों के लिए निम्नलिखित कार्यों का अच्छी तरह से उपयोग करता हूं:

DateTime rngMin = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue;

DateTime rngMax = (DateTime)System.Data.SqlTypes.SqlDateTime.MaxValue;

2
यह सबसे अधिक वोट पाने चाहिए, और सही जवाब भी है।
ताहा रहमान सिद्दीकी

हालाँकि, अवगत रहें, कि कुछ टिक अंतर हैं DateTime.MaxValueऔर SqlDateTime.MaxValue.Value। SQL सर्वर 2014 और SQL सर्वर 2016 (दूसरों की जाँच न करें) स्वीकार करें DateTime.MaxValue- जो कि काफी मज़ेदार है - से बड़ा है SqlDateTime.MaxValue.Value
मैनफ्रेड

10

.Net DateTime की तुलना SqlDateTime.MinValue या MaxValue से करते समय सावधान रहें। उदाहरण के लिए, निम्नलिखित एक अपवाद फेंक देगा:

DateTime dte = new DateTime(1000, 1, 1);
if (dte >= SqlDateTime.MinValue)
    //do something

कारण यह है कि MinValue एक SqlDateTime लौटाता है, न कि DateTime। तो .Net तुलना के लिए dte को SqlDateTime में बदलने की कोशिश करता है और क्योंकि यह स्वीकार्य SqlDateTime सीमा के बाहर है, यह अपवाद को फेंकता है।

इसका एक हल SqlDateTime.MinValue से अपने डेटटाइम की तुलना करना है। मान


1
उपयोग करने का विकल्प भी है SqlDateTime.MinValue.Valueया SqlDateTime.MaxValue.Valueदोनों प्रकार के हैं DateTime। पता नहीं उन लोगों को कब पेश किया गया था। हालाँकि, अवगत रहें, कि कुछ टिक अंतर हैं DateTime.MaxValueऔर SqlDateTime.MaxValue.Value। SQL सर्वर 2014 और SQL सर्वर 2016 (दूसरों की जांच न करें) स्वीकार करें DateTime.MaxValue- जो मजाकिया रूप से काफी बड़ा है SqlDateTime.MaxValue.Value
मैनफ्रेड

9

आपके पास दो कॉलम के लिए कोड ठीक है। उस मैपिंग क्लास पर किसी अन्य डेटाटाइम कॉलम के लिए देखें। इसके अलावा, क्वेरी और मापदंडों को देखने के लिए डेटाकनेक्ट पर लॉगिंग सक्षम करें।

dc.Log = Console.Out;

DateTime को c # '0 से आरंभ किया गया है - जो 0001-01-01 है। यह linqtosql द्वारा sql string शाब्दिक माध्यम से डेटाबेस में प्रेषित किया जाता है: '0001-01-01'। Sql इस तिथि से T-Sql डेटाइम को पार्स नहीं कर सकता है।

इससे निपटने के लिए कुछ तरीके हैं:

  • सुनिश्चित करें कि आप सभी दिनांक समय को ऐसे मान से आरंभ करते हैं, जिसे SQL संभाल सकता है (जैसे कि Sql का 0: 1900-01-01)
  • सुनिश्चित करें कि किसी भी समय ऐसा समय जो कभी-कभी छोड़ा जा सकता है, अशक्त डेटासेट हैं

1
मैं आमतौर पर 1970-01-01 का उपयोग करता हूं जो कंप्यूटर समय के लिए एक सामान्य युग है (यूनिक्स TIME_T और जावास्क्रिप्ट)
Tracker1

Log to Console.Out को रीडायरेक्ट करने की टिप के लिए धन्यवाद।
जनआगार्ड

8

यह त्रुटि तब होती है यदि आप दिनांक के प्रकार को शून्य करने के लिए चर सेट करने का प्रयास कर रहे हैं । परिवर्तनीय को अशक्त के रूप में घोषित करें, यानी डेटटाइम? । इससे समस्या का समाधान होगा।


1
यह मेरे अतिप्रवाह का जवाब था, मेरे पास मेरी मेज पर एक दूसरी तारीख थी जिसे मैं एक मूल्य नहीं दे रहा था, और इसलिए एक बार जब मैंने इसे डालने योग्य काम किया तो अशक्त सेट कर दिया। धन्यवाद!
mkimmet

3

कभी कभी आदेश कम कोड लिखने के लिए यह करने के लिए क्षेत्रों के लिए डिफ़ॉल्ट मान सेट करके डालने पर तारीख, समय और आईडी की तरह एसक्यूएल सर्वर सेट क्षेत्रों के लिए प्रयोग किया जाता है GETDATE()या NEWID()

ऐसे मामलों में इकाई वर्गों में उन क्षेत्रों की ऑटो उत्पन्न मूल्य संपत्ति को सही पर सेट किया जाना चाहिए।

इस तरह आपको कोड में मान सेट करने की आवश्यकता नहीं है (ऊर्जा की खपत को रोकना !!!) और उस अपवाद को कभी न देखें।


2

एक्सटेंशन विधि का उपयोग करें

 public static object ToSafeDbDateDBnull(this object objectstring)
    {
        try
        {
            if ((DateTime)objectstring >= SqlDateTime.MinValue)
            {
                return objectstring;
            }
            else
            {
                return DBNull.Value;
            }
        }
        catch (Exception)
        {

            return DBNull.Value;
        }

    }

DateTime objdte = new DateTime(1000, 1, 1);
dte.ToSafeDbDateDBnull();

1

आमतौर पर इसका मतलब है कि आपके वांछित मान के बजाय एक शून्य को पोस्ट किया जा रहा है, आप SQL प्रॉसेसर को चलाने की कोशिश कर सकते हैं यह देखने के लिए कि लाइनक से SQL सर्वर में क्या हो रहा है।


1

आमतौर पर इस तरह की त्रुटि तब आती है जब आप डेटटाइम रूपांतरण या पार्सिंग करते हैं। सर्वर में कैलेंडर सेटिंग की जांच करें जहां एप्लिकेशन होस्ट किया गया है, मुख्य रूप से समय क्षेत्र और लघु तिथि प्रारूप, और यह सुनिश्चित करें कि यह स्थान के लिए सही समय क्षेत्र पर सेट है। आशा है कि इससे समस्या सुलझ जाएगी।


0

मैं वही देख रहा हूं। त्रुटि पंक्ति को सम्मिलित करने पर नहीं अपितु अद्यतन पर होती है। मैं जिस तालिका का संदर्भ ले रहा हूं, उसमें दो डेटाइम कॉलम हैं, जिनमें से कोई भी अशक्त नहीं है।

मैंने पंक्ति प्राप्त करने और तुरंत इसे सहेजने (कोई डेटा परिवर्तन नहीं) करने के लिए परिदृश्य प्राप्त किया है। गेट ठीक काम करता है लेकिन अपडेट विफल रहता है।

हम NHibernate 3.3.1.4000 का उपयोग कर रहे हैं


0

यदि आप NHibernate का उपयोग कर रहे हैं, तो जाँच लें कि उपयुक्त समयरेखा गुण जो अशक्त हैं, मैपिंग में अशक्त करने के लिए सेट हैं।


0

यदि आप डेटाइम को डेटटाइम की तरह अशक्त बना देते हैं? आपके मॉडल में यह अपवाद नहीं है। मैंने अपने मामले में इस तरह की समस्या को हल किया


0

मेरे मामले में यह त्रुटि उत्पन्न हुई थी क्योंकि तालिका दिनांक कॉलम अशक्त नहीं है

नीचे के अनुसार:

Create Table #TempTable(
 ...
 ApprovalDate datatime not null.
 ...)

इस त्रुटि से बचने के लिए बस इसे शून्य-सक्षम बनाएं

 Create Table #TempTable(
 ...
 ApprovalDate datatime null.
 ...)

-3

DateTime.MinValue और DateTime.MaxValue

DateTime.MinValue = 1/1/0001 12:00:00 AM

DateTime.MaxValue = 23:59:59.9999999, December 31, 9999, 

                exactly one 100-nanosecond tick 

                before 00:00:00, January 1, 10000 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.