2010-08-06 11 views
7

मैंने कक्षा व्यक्ति संपत्ति जन्मदिनशून्य दिनांक दिनांक के रूप में परिभाषित किया है?, तो क्यों नल coalescing ऑपरेटर निम्नलिखित उदाहरण में काम नहीं करना चाहिए?सी # ?? नल कोलेसिंग ऑपरेटर प्रश्न

cmd.Parameters.Add(new SqlParameter("@Birthday", 
    SqlDbType.SmallDateTime)).Value =  
    person.Birthday ?? DBNull.Value; 

मुझे मिली संकलक त्रुटि "ऑपरेटर" थी ?? 'System.DateTime' प्रकार के ऑपरेटरों पर लागू नहीं किया जा सकता है? और 'System.DBNull' "

निम्नलिखित भी एक संकलन त्रुटि मिली: के रूप में Refactor द्वारा सिफारिश की है, और यह संकलित है, लेकिन ठीक से काम नहीं किया

cmd.Parameters.Add(new SqlParameter("@Birthday", 
    SqlDbType.SmallDateTime)).Value = 
    (person.Birthday == null) ? person.Birthday:DBNull.Value; 

मैं करने के लिए (वस्तु) एक डाली जोड़ा गया है और मूल्य दोनों मामलों में sqlserver डीबी में शून्य के रूप में संग्रहीत किया गया था।

SqlDbType.SmallDateTime)).Value =  
     person.Birthday ?? (object)DBNull.Value; 

कोई बता सकता है कि यहां क्या हो रहा है?

if (person.Birthday == null) 
    cmd.Parameters.Add("@Birthday", SqlDbType.SmallDateTime).Value 
     = DBNull.Value; 
    else cmd.Parameters.Add("@Birthday", SqlDbType.SmallDateTime).Value = 
      person.Birthday; 
+3

http://stackoverflow.com/questions/218808/c-ado-net-nulls-and-dbnull-is-there-more-efficient-syntax – sgriffinusa

+0

का डुप्लिकेट अन्य पोस्ट से प्राप्त हुआ: SqlDbType.SmallDateTime))। वैल्यू = व्यक्ति। जन्मदिन ?? (वस्तु) DBNull.Value; धन्यवाद! –

उत्तर

20

समस्या यह है कि DateTime? और DBNull.Value एक ही प्रकार ताकि आप उन पर अशक्त कोलेसिंग ऑपरेटर का उपयोग नहीं कर सकते हैं नहीं कर रहे हैं:

मैं निम्नलिखित अनाड़ी कोड का उपयोग करने की जरूरत है।

अपने मामले में आप के माध्यम से Add()

3

लिए आपका पहला समस्या यह है कि ?? या ?: ऑपरेटर के लिए, या तो चुनाव के लिए वस्तुओं एक ही प्रकार का होना चाहिए है प्रकार object के एक मूल्य पारित करने के लिए person.Birthday ?? (object)DBNull.Value कर सकते हैं। यहां वे अलग-अलग प्रकार हैं।

+1

तो '?:' क्या करता है? संपादित करें: कभी नहीं, मुझे पता था कि, उन 2 प्रतीकों को पहले कभी नहीं देखा था। http://msdn.microsoft.com/en-us/library/ty67wk28.aspx –

3

मैं अपने मापदंडों से अधिक पुनरावृति करना पसंद करते हैं, उदाहरण के लिए बस क्वेरी को क्रियान्वित करने, उचित रूप में DBNull को अशक्त के सभी उदाहरणों को बदलने से पहले:

foreach (IDataParameter param in cmd.Parameters) 
    if (param.Value == null) 
     param.Value = DBNull.Value; 

यह मैं शून्य मान छोड़ के रूप में है और बस उन्हें स्वैप की सुविधा देता है बाद में बड़े पैमाने पर बाहर।

+0

मेरे लिए यह साफ और सरल, अच्छा जवाब है। –

+0

इस के साथ मेरा मुद्दा तथ्य के बाद पैरामीटर पर पुनरावृत्ति के अतिरिक्त ओवरहेड है, बनाम तुरंत उन्हें संभालना। – Andrew

संबंधित मुद्दे