2010-10-28 10 views
5

मैंने देखा है कि this thread स्टैक ओवरफ़्लो पर डीबीएनयूएल और नालीबल प्रकारों के बीच कनवर्ट करने के बारे में है लेकिन मैं अभी भी उलझन में हूं। मैं दिनांक समय के लिए नल प्रकार से निपटने के लिए कुछ हैक कोड के साथ इस तरह कोड लिखा और ints है कि मैं नीचे लेकिन it'sa गड़बड़ दिखाई देगा और मैं Nullable प्रकार का उपयोग करना चाहते है:नलबल प्रकार, डीबीएनयूल्स और डेटा पंक्तियों के साथ समस्या

DataTable dt = ds.Tables[0]; 
List<RON> list = (from dr in dt.AsEnumerable() 
           select new RON 
           { 
            RONId = dr[0].ToString(), 
            StaffNumber = dr[1].ToString(), 
            CheckInDate = GetCheckInDate(dr[2]), 
            NonMissionIndicator = dr[3].ToString(), 
            Comments = dr[4].ToString(), 
            NonComplyIndicator = dr[5].ToString(), 
            LOAirport = dr[6].ToString(), 
            RONAirport = dr[7].ToString(), 
            PropertyId = GetPropertyId(dr[8]), 
            PropertyChain = dr[9].ToString(), 
            PropertyName = dr[10].ToString(), 
            PropertyStreet = dr[11].ToString(), 
            PropertyStreet2 = dr[12].ToString(), 
            PropertyCity = dr[13].ToString(), 
            PropertyState = dr[14].ToString(), 
            PropertyPostalCode = dr[15].ToString(), 
            PropertyPhone = dr[16].ToString(), 
            FAX = dr[17].ToString(), 
            PropertyCountry = dr[18].ToString(), 
            PropertyLongitude = GetPropertyLongitude(dr[19]), 
            PropertyLatitude = GetPropertyLatitude(dr[20]), 
            PropertyAirport = dr[21].ToString(), 
            ReportedBy = dr[22].ToString(), 
            ReportedDTS= GetReportedByDate(dr[23]), 
            CanceledBy = dr[24].ToString(), 
            CanceledDTS = GetCanceledByDate(dr[25]) 
           }).ToList(); 
      return list; 
     } 

     //TODO: Change Defaukt date 
     private static DateTime GetCheckInDate(object checkInDate) 
     { 
      return checkInDate == DBNull.Value ? new DateTime(2000, 1, 1, 00, 00, 00) : Convert.ToDateTime(checkInDate); 
     } 

     //TODO: Change Defaukt date 
     private static DateTime GetReportedByDate(object reportedByDate) 
     { 
      return reportedByDate == DBNull.Value ? new DateTime(2000, 1, 1, 00, 00, 00) : Convert.ToDateTime(reportedByDate); 
     } 

     //TODO: Change Defaukt date 
     private static DateTime GetCanceledByDate(object canceledByDate) 
     { 
      return canceledByDate == DBNull.Value ? new DateTime(2000, 1, 1, 00, 00, 00) : Convert.ToDateTime(canceledByDate); 
     } 

     private static Int32 GetPropertyId(object propertyId) 
     { 
      return propertyId == DBNull.Value ? 0 : Convert.ToInt32(propertyId); 
     } 

     private static double GetPropertyLongitude(object propertyLongitude) 
     { 
      return propertyLongitude == DBNull.Value ? 0.0 : Convert.ToDouble(propertyLongitude); 
     } 

     private static double GetPropertyLatitude(object propertyLatitude) 
     { 
      return propertyLatitude == DBNull.Value ? 0.0 : Convert.ToDouble(propertyLatitude); 
     } 

रॉन अब के रूप में परिभाषित किया गया है:

public class RON 
    { 
     public string RONId { get; set; } 
     public string StaffNumber { get; set; } 
     public DateTime CheckInDate { get; set; } 
     public string NonMissionIndicator { get; set; } 
     public string NonComplyIndicator { get; set; } 
     public string LOAirport { get; set; } 
     public string RONAirport { get; set; } 
     public int PropertyId { get; set; } 
     public string PropertyChain { get; set; } 
     public string PropertyName { get; set; } 
     public string PropertyStreet { get; set; } 
     public string PropertyStreet2 { get; set; } 
     public string PropertyCity { get; set; } 
     public string PropertyState { get; set; } 
     public string PropertyPostalCode { get; set; } 
     public string PropertyCountry { get; set; } 
     public string PropertyPhone { get; set; } 
     public string FAX { get; set; } 
     public double PropertyLongitude { get; set; } 
     public double PropertyLatitude { get; set; } 
     public string PropertyAirport { get; set; } 
     public string ReportedBy { get; set; } 
     public DateTime ReportedDTS { get; set; } 
     public string CanceledBy { get; set; } 
     public DateTime CanceledDTS { get; set; } 
     public string Comments { get; set; } 

डेटाबेस पुरुष मुझसे कहता है कि इस ओरेकल से वापसी डेटासेट/कर्सर में है:

RON_ID         NOT NULL VARCHAR2(40) 
STAFF_NUM         NOT NULL VARCHAR2(12) 
CHECKIN_DATE        NOT NULL DATE 
NONMISSION_IND       NOT NULL VARCHAR2(1) 
COMMENTS           VARCHAR2(4000) 
NONCOMPLY_IND          VARCHAR2(4000) 
PROPERTY_ID        NOT NULL NUMBER(38) 
PROPERTY_CHAIN          VARCHAR2(2) 
PROPERTY_NAME          VARCHAR2(255) 
RON_AIRPORT        NOT NULL VARCHAR2(3) 
PROPERTY_STREET         VARCHAR2(255) 
PROPERTY_STREET2         VARCHAR2(255) 
PROPERTY_CITY          VARCHAR2(255) 
PROPERTY_STATE          VARCHAR2(3) 
PROPERTY_POSTALCODE        VARCHAR2(255) 
PROPERTY_PHONE          VARCHAR2(20) 
PROPERTY_FAX          VARCHAR2(20) 
PROPERTY_COUNTRY         VARCHAR2(2) 
PROPERTY_LONGITUDE         NUMBER 
PROPERTY_LATITUDE         NUMBER 
PROPERTY_AIRPORT         VARCHAR2(3) 
REPORTED_BY          VARCHAR2(50) 
REPORTED_DTS        NOT NULL DATE 
CANCELED_BY          VARCHAR2(50) 
CANCELED_DTS          DATE 

मैं कैसे Nullable प्रकार के साथ रॉन घोषणा कर सकते हैं और मैं नू साथ संचालन कैसे कर सकते हैं लेटेबल तिथियां और ऐसे? तारों की जांच की जानी चाहिए?

उत्तर

6

Nullable के रूप में (जैसे दिनांक समय के रूप में), एक मूल्य के प्रकार को परिभाषित करने के लिए ... निम्न में से एक कार्य करें:

DateTime? ReportedDTS 

या

Nullable<DateTime> ReportedDTS 

संदर्भ प्रकार (जैसे स्ट्रिंग के रूप में) पहले से ही कर रहे हैं " नल "।

एक DataRow आप क्षेत्र विस्तार विधि का उपयोग कर सकते हैं के बाहर एक नल मूल्य प्राप्त करने के लिए:

DateTime? nullableDate = dataRow.Field<DateTime?>("ColumnName"); 

कि स्वचालित रूप से DBNull में परिवर्तित कर देंगे शून्य पर।

तो अपने उदाहरण के लिए आप की तरह कुछ कर सकते हैं:

select new RON 
      { 
       RONId = dr.Field<string>("RON_ID"), 
       // snip... 
       CheckInDate = dr.Field<DateTime?>("CHECKIN_DATE"), 
       // snip... 
      }; 
+0

धन्यवाद! तो डेटटाइम? nullableDate = dataRow।फ़ील्ड ("कॉलमनाम"); मेरे उदाहरण में यह क्या होगा? –

+0

मेरा उदाहरण अपडेट किया गया .... – Dismissile

+0

मुझे "निर्दिष्ट कास्ट मान्य नहीं है।"} [System.InvalidCastException]: {"निर्दिष्ट कास्ट मान्य नहीं है।"} डेटा: {System.Collections.ListDictionaryInternal} हेल्पलिंक : शून्य इनर एक्सेप्शन: शून्य संदेश: "निर्दिष्ट कास्ट मान्य नहीं है।" स्रोत: "System.Data.DataSetExtensions" स्टैकट्रेस: ​​"System.Data.DataRowExtensions.UnboxT'1.NullableField [TElem] (ऑब्जेक्ट वैल्यू) \ r \ n System.Data.DataRowExtensions.Field [T] (दा पर –

0

के रूप में केवल मूल्य प्रकार Nullable बनाया जा सकता है, तो आप कुछ भी तार के लिए विशेष करने की ज़रूरत नहीं होगी। आदिम प्रकार (और DateTime) को int? NullableNumber { get; set; } जैसे उनके नाम के नाम के बाद एक प्रश्न चिह्न जोड़कर निरर्थक घोषित किया जा सकता है।

+0

धन्यवाद, यही है मैंने सोचा –

0

आप या तो एक दिनांक समय या नल

myNullableDate = (DBNull.Value == list.Field<object>("FOO")) 
      ? null 
      : (DateTime?)list.Field<DateTime?>("FOO"); 
0

बताए अपने मूल प्रश्न, की समीक्षा करने में मुझे लगता है कि एक त्रुटि हो जाएगा .ToString() है जब से पहले DBNull के खिलाफ तुलना करने के लिए आवश्यकता हो सकती है एक शून्य मूल्य पर बुलाया।

This happens when the dataset field has a DBNULL value. 
The Best approach is to test for null first before calling any methods on the object. 
i.e.

DataTable dt = ds.Tables[0]; List<RON> list = (from dr in dt.AsEnumerable() select new RON { RONId = dr.IsNull("RONid") ? "0" : dr.Field<String>("RONid"), StaffNumber = dr.IsNull("StaffNumber") ? "0" : dr.Field<String>("StaffNumber"), ... etc, ... etc }).ToList(); return list; }

पुनश्च:

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