2013-03-01 5 views
38

मैं txtBirthDate को मान्य नहीं करना चाहता हूं इसलिए मैं डेटाबेस में DateTime.MinValue पास करना चाहता हूं।डेटटाइम .MinValue और SqlDateTime ओवरफ्लो

मेरे कोड:

if (txtBirthDate.Text == string.Empty) 
    objinfo.BirthDate = DateTime.MinValue; 
else 
    objinfo.BirthDate = DateTime.Parse(txtBirthDate.Text); 

DateTime.MinValue वापसी Date = {1/1/0001 12:00:00 AM}

मैं एक एसक्यूएल त्रुटि मिला:

SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.

मैं के तहत यह खड़े लेकिन मैं क्यों DateTime.MinValue वापसी अमान्य दिनांक समय समझ में नहीं आता जो डेटाबेस में सम्मिलित करने में असमर्थ है। इस प्रकार की स्थिति को कैसे संभालें?

+0

एक मिनट-मूल्य अपने आप को परिभाषित प्राप्त करने के लिए सरल? –

+1

संदेश आपको यह बताने की तरह है। SQL सर्वर द्वारा स्वीकृत न्यूनतम दिनांक समय 1/1/1753 है जबकि .Net 1/1/0001 का उपयोग करता है। आपको क्या समझ नहीं आया? –

+5

तर्क सी # में 'डेटटाइम' का उपयोग करने का सुझाव देगा, फ़ील्ड को डेटाबेस में शून्य स्वीकार करने की अनुमति दें और 'objinfor.BirthDate.HasValue'' false' के मामले में 'DBNull.Value' डालें। मेरा मतलब यह है कि यह वास्तविकता को प्रतिबिंबित करना चाहिए। यदि ऐसी स्थिति जहां जन्म तिथि नहीं है, तो यह स्वीकार्य होना चाहिए। – tpeczek

उत्तर

70

असल में, अनुपलब्ध मान का प्रतिनिधित्व करने के लिए DateTime.MinValue का उपयोग न करें। आप नहीं कर सकते उपयोग DateTime.MinValue एक एसक्यूएल सर्वर दिनांक समय क्षेत्र में, के रूप में एसक्यूएल सर्वर के बजाय 1753

की शुरुआत की एक न्यूनतम मूल्य है, अपने BirthDate संपत्ति एक Nullable<DateTime> (उर्फ DateTime?) बनाने के लिए, और null के लिए सेट जब आपके पास कोई मूल्य नहीं है। यह भी सुनिश्चित करें कि आपका डेटाबेस फ़ील्ड शून्य है। फिर आपको यह सुनिश्चित करने की ज़रूरत है कि null डेटाबेस में NULL मान के रूप में समाप्त होता है। वास्तव में आप ऐसा कैसे करेंगे जो आपके डेटा एक्सेस पर निर्भर करेगा, जिसे आपने हमें कुछ भी नहीं बताया है।

+3

डब्ल्यूसीएफ स्वचालित रूप से 'DateTime.MinValue' मानता है यदि आपके 'ऑपरेशन कंट्रैक्ट' पर 'डेटटाइम' पैरामीटर छोड़ा गया है। इसके अलावा, डब्ल्यूसीएफ 'Nullable ' पैरामीटर स्वीकार नहीं करता है। इसका अर्थ यह है कि प्रत्येक 'ऑपरेशन कंट्रैक्ट' में आपको कुछ करने के लिए मजबूर होना पड़ता है जैसे कि अगर (myDate crush

+2

@ क्रश: क्या आपको अपने डब्ल्यूसीएफ मॉडल और अपने एसक्यूएल मॉडल को सीधे जोड़ना है? मुझे संदेह है कि मेरे पास "लॉजिकल" मॉडल होगा जिसमें 'न्यूबल योग्य ' था, और जब से मुझे डब्ल्यूसीएफ का उपयोग करने की आवश्यकता थी तब से उसमें कनवर्ट किया गया था। ऐसा नहीं है कि मैंने डब्ल्यूसीएफ का बहुत उपयोग किया है, लेकिन यह बाकी मॉडल को पार करने के लिए डब्ल्यूसीएफ की सीमाओं के लिए एक बुरा विचार लगता है। –

+0

जवाब देने के लिए धन्यवाद। अगर मैं आपकी प्रतिक्रिया गलत पढ़ रहा हूं तो मुझे सही करें। क्या आप सुझाव दे रहे हैं कि डेटा एक्सेस लेयर या एसक्यूएल सर्वर के विपरीत 'डेटटाइम' के न्यूनतम मूल्य को बाध्य करने के लिए मॉडल/डीएओ जिम्मेदार होगा? – crush

2

MSDN से:

Date and time data from January 1, 1753, to December 31, 9999, with an accuracy of one three-hundredth second, or 3.33 milliseconds. Values are rounded to increments of .000, .003, or .007 milliseconds. Stored as two 4-byte integers. The first 4 bytes store the number of days before or after the base date, January 1, 1900. The base date is the system's reference date. Values for datetime earlier than January 1, 1753, are not permitted. The other 4 bytes store the time of day represented as the number of milliseconds after midnight. Seconds have a valid range of 0–59.

एसक्यूएल से दिनांक समय मूल्यों के लिए सी # एक अलग प्रणाली का उपयोग करता है।

आप अपने मिनवैल्यू को सेंटीनेल वैल्यू के रूप में उपयोग कर सकते हैं - और यदि यह मिनीवैल्यू है - तो अपने ऑब्जेक्ट में पास करें (और तारीख को डीबी में शून्य के रूप में स्टोर करें)।

if(date == dateTime.Minvalue) 
    objinfo.BirthDate = null; 
-5

उपयोग एक्सटेंशन

public static class DateTimeExtensions 
{ 
    public static DateTime MinValue(this DateTime sqlDateTime) 
    { 
     return new DateTime(1900, 01, 01, 00, 00, 00); 
    } 
} 


DateTime date = DateTime.Now; 
Console.WriteLine("Minvalue is {0} ", date.MinValue().ToShortDateString()); 
2

सीधे शब्दों में कहें, एक डिफ़ॉल्ट मान के रूप में नहीं उपयोग DateTime.MinVaue है।

वहाँ अलग अलग MinValues की एक जोड़ी बाहर, निर्भर करता है जो पर्यावरण में हो रहे हैं।

मैं एक बार एक परियोजना, जहां मैं एक Windows CE परियोजना को लागू किया गया था, मैं का उपयोग कर रहा था फ्रेमवर्क के DateTime.MinValue (वर्ष 0001) , डेटाबेस MinValue (1753) और एक यूआई नियंत्रण DateTimePicker (मुझे लगता है कि यह 1 9 70 था)। तो कम से कम 3 अलग-अलग MinValues ​​ थे जो अजीब व्यवहार और अप्रत्याशित परिणामों की ओर अग्रसर थे। (और मुझे विश्वास है कि चौथा (!) संस्करण भी था, मुझे याद नहीं आया कि यह कहां से आया था।)।

एक शून्य डेटाबेस डेटाबेस का उपयोग करें और इसके बजाय अपना मान Nullable<DateTime> में बदलें। जहां आपके कोड में कोई मान्य मान है, वहां डेटाबेस में भी एक मान होना चाहिए। :-)

59

DateTime.MinValue का उपयोग करने से बहुत आसान बचने के बजाय System.Data.SqlTypes.SqlDateTime.MinValue का उपयोग करें।

+4

पर वापस जा रहे हैं। 'System.Data.SqlTypes.SqlDateTime.MinValue.Value का उपयोग करें। 'यदि आप' डेटटाइम 'में मान असाइन करना चाहते हैं तो टाइप करें – sohaiby

3

Here is what you can do. Though there are lot many ways to achieve it.

DateTime? d = null;  
if (txtBirthDate.Text == string.Empty) 
    objinfo.BirthDate = d; 
else 
    objinfo.BirthDate = DateTime.Parse(txtBirthDate.Text); 

Note: This will work only if your database datetime column is Allow Null. Else you can define a standard minimum value for DateTime d.

3

मैं इस समारोह का उपयोग कर रहा TryParse को

public static bool TryParseSqlDateTime(string someval, DateTimeFormatInfo dateTimeFormats, out DateTime tryDate) 
    { 
     bool valid = false; 
     tryDate = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue; 
     System.Data.SqlTypes.SqlDateTime sdt; 
     if (DateTime.TryParse(someval, dateTimeFormats, DateTimeStyles.None, out tryDate)) 
     { 
      try 
      { 
       sdt = new System.Data.SqlTypes.SqlDateTime(tryDate); 
       valid = true; 
      } 
      catch (System.Data.SqlTypes.SqlTypeException ex) 
      { 

      } 
     } 

     return valid; 
    } 
8

हालांकि यह एक पुराने सवाल यह है कि, एक और समाधान डेटाबेस स्तंभ के लिए datetime2 उपयोग करने के लिए है। MSDN Link

+0

सही। एसक्यूएल सर्वर डेटाटाइम वास्तव में 1753 की शुरूआत है, लेकिन एसक्यूएल सर्वर 2008 के साथ और अधिक से अधिक आपको डेटाटाइम 2 का उपयोग करना चाहिए, साथ ही साथ मेल खाता है। 0001 –

+1

के वर्ष में वापस जा रहा है शायद यह सबसे आसान और शायद सबसे अच्छा समाधान है, मानते हुए ओपी बदल सकता है डेटाबेस क्वेरी पैरामीटर। जैसा कि निम्न लिंक बताता है, नए काम को 'डेटाटाइम 2' का उपयोग करना चाहिए: https://msdn.microsoft.com/en-us/library/ms187819.aspx – Neo

-1

खैर ... इसकी काफी एसक्यूएल मिनट तारीख

DateTime sqlMinDateAsNetDateTime = System.Data.SqlTypes.SqlDateTime.MinValue 
संबंधित मुद्दे