2010-10-20 21 views
7

को संभालने में मैंने एसओ पर इसके कई सारे संस्करण देखे हैं, लेकिन उनमें से कोई भी मेरी ज़रूरतों के लिए काफी काम नहीं कर रहा है।डेटटाइम डीबीएनयूएल

मेरा डेटा एक विक्रेता डेटाबेस से आता है जो डेटटाइम फ़ील्ड के लिए शून्य की अनुमति देता है। सबसे पहले मैं अपने डेटा को डेटाटेबल में खींचता हूं।

using (SqlCommand cmd = new SqlCommand(sb.ToString(), conn)) 
using (SqlDataAdapter da = new SqlDataAdapter(cmd)) 
{ 
    da.Fill(dt); 
} 

मैं प्रोसेसिंग के लिए डेटाटेबल को सूची <> में परिवर्तित कर रहा हूं।

var equipment = from i in dt.AsEnumerable() 
    select new Equipment() 
    { 
     Id = i.Field<string>("ID"), 
     BeginDate = i.Field<DateTime>("BeginDate"), 
     EndDate = i.Field<DateTime>("EndDate"), 
     EstimatedLife = i.Field<double>("EstimatedLife") 
    } 

तो, मैं इस उदाहरण में डीबीएनयूएल की जांच कैसे करूं? मैंने एक विधि लिखने की कोशिश की।

public DateTime CheckDBNull(object dateTime) 
    { 
     if (dateTime == DBNull.Value) 
      return DateTime.MinValue; 
     else 
      return (DateTime)dateTime; 
    } 

उत्तर

7

एक संभावित विकल्प वाक्य रचना DateTime?

यहाँ के साथ एक नल दिनांक समय के रूप में संग्रहीत है नल प्रकार

+0

तो 'दिनांक समय के रूप में' DateTime' क्षेत्रों को परिभाषित ' –

+0

यदि यह के लिए एक वैध व्यापार के मामले है आपके उपकरण शुरू या समाप्ति तिथि नहीं है तो हाँ। अन्यथा आपकी डीबी परत को अपवाद फेंकना चाहिए। –

+1

हाँ - यह 'Nullable ' के लिए शॉर्टकट है –

6

उपयोग IsDBNull()

System.Convert.IsDBNull(value); 

या यदि आप एक SqlDataReader

reader.IsDBNull(ordinal); 

है और अपने DateTime गुण व्यर्थ होने के लिए (DateTime?) बनाने के लिए और DBNull के मामले में null निर्धारित किया है। Field<T>() स्वचालित रूप से ऐसा करेगा।

0

यहाँ का उपयोग कर के बारे में link to the MSDN है कुछ कोड का एक उदाहरण मैं datetimes

पढ़ने के लिए उपयोग है

im यकीन है कि यह बेहतर लिखा जा सकता है, लेकिन मुझे

public DateTime? ReadNullableDateTimefromReader(string field, IDataRecord data) 
    { 

     var a = data[field]; 
     if (a != DBNull.Value) 
     { 
      return Convert.ToDateTime(a); 
     } 
     return null; 
    } 

    public DateTime ReadDateTimefromReader(string field, IDataRecord data) 
    { 
     DateTime value; 
     var valueAsString = data[field].ToString(); 
     try 
     { 
      value = DateTime.Parse(valueAsString); 
     } 
     catch (Exception) 
     { 
      throw new Exception("Cannot read Datetime from reader"); 
     } 

     return value; 
    } 
0

आपका उपयोग करना चाहिए के लिए ठीक चलाता है डेटटाइम शून्य की तुलना करने के लिए।

उदा .:

if(studentDataRow["JoinDate"] is DBNull) { // Do something here } 
1

मैं ने पाया है कि "के रूप में" कीवर्ड का उपयोग कर अपने डेटा प्रकार के रूप क्षेत्र कास्ट करने के लिए सबसे आसान तरीका है इस संभाल करने के लिए। यह डेटाबेस फ़ील्ड के लिए बहुत अच्छा काम करता है जो शून्य हो सकता है, और यह अच्छा और सरल है।

यहाँ इस बारे में अधिक विस्तार है: Direct casting vs 'as' operator?

उदाहरण:?

IDataRecord record = FromSomeSqlQuerySource; 
    string nullableString; 
    DateTime? nullableDateTime; 

    nullableString = record["StringFromRecord"] as string; 
    nullableDateTime = record["DateTimeFromRecord"] as DateTime?; 
मेरी उपकरण वस्तु पर
संबंधित मुद्दे