2012-11-25 21 views
9

के रूप में डेटटाइम के लिए एक शून्य ऑब्जेक्ट को पार्स करने का प्रबंधन कैसे करें मेरे पास दो डेटटाइम ऑब्जेक्ट्स, बर्थडेट और हायरडेट हैं। वे एक स्ट्रिंग के रूप में सही ढंग से स्वरूपित होते हैं और जब मैं उन्हें अपने डेटा एक्सेस लेयर के माध्यम से पास करता हूं, तो उन्हें डेटटाइम ऑब्जेक्ट में पार्स करने की आवश्यकता होती है।एडीओ.NET के साथ डीबीएनयूएलएल

DateTime hD = DateTime.Parse(hire);    
DateTime bD = DateTime.Parse(birth); 

//incase of a datestring being passed through 
dateStringPassed = "7/2/1969"; 

लेकिन कभी कभी, तार hire और birth शून्य या खाली "" कर रहे हैं, अगर कोड इस तरह चलाया जाता है, मैं एक खाली स्ट्रिंग पार्स से एक FormatException त्रुटि मिलती है। मैं खाली पार्स कैसे प्रबंधित कर सकता हूं और डेटटाइम को खाली या शून्य के रूप में कैसे अनुमति दे सकता हूं, DBNull.Value के रूप में स्वीकार किया जा सकता है?

मैं अभी भी उपयोगकर्ता को डेटटाइम स्ट्रिंग से गुज़रने में परेशान नहीं कर सकता, फिर पार्स मेरे कोड को क्रैश करता है।

जन्म तिथि के लिए मेरा पैरामीटर निम्नानुसार है और शून्य को परिवर्तनीय जांचता है, फिर डीबीएनयूएल का उपयोग करें। वैल्यू।

उत्तर

2

आपको nullable दिनांक समय का उपयोग करने की आवश्यकता है - शॉर्टकट वाक्यविन्यास DateTime? होगा (अंत में ? पर ध्यान दें)।

DateTime? hD = null; 
if(!string.IsNullOrWhitespace(hire)) // string.IsNullOrEmpty if on .NET pre 4.0 
{ 
    hD = DateTime.Parse(hire);    
} 

आप hD.HasValue के लिए परीक्षण कर सकते हैं और अगर यह DbNull.Value बजाय का उपयोग नहीं करता।

+0

आप दिनांक समय BD = DateTime.Parse (जन्म) के साथ एक उदाहरण लिख सकते हैं? अंत में एक 'int' के लिए भी '?' का उपयोग करेंगे? – GivenPie

+0

@GivenPie - हाँ, यह 'int 'और किसी भी मान प्रकार के लिए होगा। – Oded

+0

कूल, धन्यवाद ओडेड! – GivenPie

9

Parse विधि रिक्त स्ट्रिंग को संभाल नहीं सकते, लेकिन आप व्यर्थ दिनांक समय का उपयोग करें और कुछ इस तरह कर सकते हैं:

DateTime? hD = String.IsNullOrEmpty(hire) ? (DateTime?)null : DateTime.Parse(hire) 

लेकिन फिर भी सुरक्षित बजाय TryParse का उपयोग करेंगे:

DateTime? hD = null; 
DateTime.TryParse(hire, out hD); 

फिर इस मान को संग्रहीत करने के लिए, आप hD.HasValue:

if(hD.HasValue) { /* use hD */ } 
else { /* else use DBNull.Value */ } 
का परीक्षण कर सकते हैं

के बाद से सी # 7, तुम बाहर इनलाइन मापदंडों के लिए छोटे वाक्य विन्यास का उपयोग कर सकते हैं और आप व्यर्थ प्रकार से बच सकते हैं:

if (DateTime.TryParse(hire, out var hD)) { /* use hD */ } 
else { /* use DBNull.Value */ } 
+1

मेरा मानना ​​है कि संकलन करने के लिए आपको उस लाइन को पाने के लिए उस टर्नरी ऑपरेटर में 'शून्य' डालना होगा। ':' के दोनों पक्षों को उसी प्रकार या प्रकार के होने की आवश्यकता है जिनके बीच अंतर्निहित रूपांतरण हो। – Oded

+0

आप सही हैं, मैं अपना जवाब संपादित करूंगा। –

+1

और वह अंतिम पंक्ति - मुझे नहीं लगता कि आप इसे कैसे डाल सकते हैं ताकि संकलक इसे स्वीकार कर सके। – Oded

0

आप इस विधि का, किसी भी बात यह है कि का उपयोग करते हैं न एक सही दिनांक एक वापस आ जाएगी DBNull.Value:

/// <summary> 
/// Parses a date string and returns 
/// a DateTime if it is a valid date, 
/// if not returns DBNull.Value 
/// </summary> 
/// <param name="date">Date string</param> 
/// <returns>DateTime or DBNull.Value</returns> 
public static object CreateDBDateTime(string date) 
{ 
    DateTime result; 
    if (DateTime.TryParse(date, out result)) 
    { 
     return result; 
    } 
    return DBNull.Value; 
}