2010-06-29 13 views
6

मुझे पंक्तियों से चयन करते समय त्रुटि मिल रही है। ASNumerable()। मैं निम्नलिखित कोड का उपयोग कर रहा हूँ ...लिंक और डीबीएनयूएल - त्रुटि प्राप्त करना

var rows = ds.Tables[0].AsEnumerable(); 
       trafficData = rows.Select(row => new tdDataDC 
       { 
        CalculationCount = row.Field<Int64>("biCalculationCountSeqID") 
        , Zone = row.Field<Int16>("siFkZoneId") 
        , Miles = row.Field<decimal>("dcMiles") 
        , Plaza = row.Field<Int16>("siFkPlazaId") 
        , VehicleCount = row.Field<int>("iVehicleCount") 


       }); 

समय यह अच्छी तरह से काम करता है, लेकिन जब वहाँ डेटाबेस में NULLS मैं इस त्रुटि मिल रही हैं "टाइप करने के लिए 'System.Int16 DBNull.Value नहीं दिया जा सकता से अधिकांश 'कृपया एक शून्य प्रकार का उपयोग करें .. " मैं इसे कैसे ठीक कर सकता हूं? मैं नहीं चाहता कि मेरे डेटाकंट्रैक्ट्स में नलबल प्रकार हों, मैं एक टर्नरी या कुछ का उपयोग करना चाहता हूं, और यदि कोई मान नल है, तो बस इसका उपयोग करें। क्या यह संभव है?

किसी भी मदद के लिए धन्यवाद,
~ सी.के.

उत्तर

7

का तरीका यहां बताया nulls के लिए परीक्षण ...

Plaza = row.IsNull("siFkPlazaId") ? 0 : row.Field<int>("siFkPlazaId") 
11

तुम हमेशा एक और विस्तार विधि (untested) जोड़ सकते है:

public static T FieldOrDefault<T>(this DataRow row, string columnName) 
    { 
     return row.IsNull(columnName) ? default(T) : row.Field<T>(columnName); 
    } 

फिर आपकी कॉलिट इस तरह दिखती है:

var rows = ds.Tables[0].AsEnumerable(); 
       trafficData = rows.Select(row => new tdDataDC 
       { 
        CalculationCount = row.FieldOrDefault<Int64>("biCalculationCountSeqID") 
        , Zone = row.FieldOrDefault<Int16>("siFkZoneId") 
        , Miles = row.FieldOrDefault<decimal>("dcMiles") 
        , Plaza = row.FieldOrDefault<Int16>("siFkPlazaId") 
        , VehicleCount = row.FieldOrDefault<int>("iVehicleCount") 


       }); 
+1

मैं मार्क का जवाब चाहते हैं, लेकिन इसे करने का एक और तरीका है पाने के लिए, आप मूल्य प्रकार बदलने के नल (कम होने के लिए कर सकता है? लंबा? आदि) और फिर coalesce, तो पंक्ति की तरह कुछ। फ़ील्ड ("foo") ?? 0 –

+0

बीटीडब्ल्यू, 2 पंक्ति कॉल करने के बजाए, यदि टी हमेशा एक मान प्रकार है, तो आप पंक्ति कर सकते हैं। फ़ील्ड > (कॉलमनाम) ?? डिफ़ॉल्ट (टी) हालांकि मुझे संदेह है कि यदि आप संदर्भ प्रकारों का भी उपयोग करते हैं तो यह परेशानी के लायक है :) –

4

यदि आपकी संपत्ति शून्य है तो आप यह भी कर सकते हैं;

Plaza = row.Field<int16?>("siFkPlazaId") 
+0

भयानक उत्तर! – DasDas

1

मैं ?? ऑपरेटर के बहुत शौकीन हूँ:

CalculationCount = row.Field<Int64?>("biCalculationCountSeqID") ?? 0 
       , Zone = row.Field<Int16?>("siFkZoneId") ?? 0 
       , Miles = row.Field<decimal?>("dcMiles") ?? 0.0m 
       , Plaza = row.Field<Int16?>("siFkPlazaId") ?? 0 
       , VehicleCount = row.Field<int>("iVehicleCount") 0; 
संबंधित मुद्दे