2012-09-16 12 views
9

को DBNull.Value और खाली पाठ बॉक्स मूल्य पासिंग मैं जो खाली हैं क्योंकि वे वैकल्पिक हैं हो सकता है अपने पन्ने पर कुछ बक्सें है और मैं इस दाल कोडडेटाबेस

parameters.Add(new SqlParameter("@FirstName", FirstName)); 
parameters.Add(new SqlParameter("@LastName", LastName)); 
parameters.Add(new SqlParameter("@DisplayName", DisplayName)); 
parameters.Add(new SqlParameter("@BirthDate", BirthDate)); 
parameters.Add(new SqlParameter("@Gender", Gender)); 

उन क्षेत्रों में से कोई भी खाली किया जा सकता है। समस्या यह है कि जब वे खाली हैं मैं Procedure XXX requires @FirstName which was not supplied

प्राप्त तब मैं

parameters.Add(new SqlParameter("@FirstName", String.IsNullOrEmpty(FirstName) ? DBNull.Value : (object)FirstName)); 
parameters.Add(new SqlParameter("@LastName", String.IsNullOrEmpty(LastName) ? DBNull.Value : (object) LastName)); 
parameters.Add(new SqlParameter("@DisplayName", String.IsNullOrEmpty(DisplayName) ? DBNull.Value : (object) DisplayName)); 
parameters.Add(new SqlParameter("@BirthDate", BirthDate.HasValue ? (object)BirthDate.Value : DBNull.Value)); 
parameters.Add(new SqlParameter("@Gender", String.IsNullOrEmpty(Gender) ? DBNull.Value : (object) Gender)); 

करने के लिए अपने कोड बदल लेकिन यह मुझे विशेष रूप से object लिए कास्टिंग के लिए गंदा लग रहा है क्योंकि त्रिगुट बयान एक ही प्रकार के होने के लिए दोनों मूल्य की आवश्यकता है।

डेटाबेस में NULL खाली स्ट्रिंग या शून्य स्ट्रिंग का इलाज क्यों नहीं किया जाता है? अगर मुझे इसे DBNull.Value में परिवर्तित करना है तो क्या एक क्लीनर तरीका है? डेटाबेस में खाली स्ट्रिंग के रूप में मूल्य को सहेजने में मदद मिली हो सकती है लेकिन डेटाबेस में NULL के लिए क्वेरी गड़बड़ हो जाएगी

कृपया सामान्य प्रथाओं या उसके करीब कुछ पर अपनी सलाह दें।

उत्तर

10

सबसे पहले कोशिश करें, 2 अधिक काम भार के देखते हैं:

command.Parameters.Add("@name").Value = value; 

या

command.Parameters.AddWithValue("@name", value); 

व्यक्तिगत तौर पर मैं निम्नलिखित विस्तार विधि का उपयोग करें:

public static object DbNullIfNull(this object obj) 
{ 
    return obj != null ? obj : DBNull.Value; 
} 

command.Parameters.AddWithValue("@name", value.DbNullIfNull()); 

या

public static object DbNullIfNullOrEmpty(this string str) 
{ 
    return !String.IsNullOrEmpty(str) ? str : (object)DBNull.Value; 
} 
+0

मेरे पास कमांड ऑब्जेक्ट तक पहुंच नहीं है क्योंकि मैंने इसे बेस क्लास में समेकित किया है, इसलिए मैं इसे कई डेटाबेस [किसी विशेष डेटाबेस पर निर्भरता से परहेज] के साथ उपयोग कर सकता हूं। मुझे एक्सटेंशन विधियों के दृष्टिकोण पसंद हैं। धन्यवाद। – codingbiz

+0

मुझे लगता है कि 'DbNullIfNull' के साथ कुछ गलत है। मैं वहां तर्क को समझ नहीं पाया, इसलिए मैंने इसे अपने .NET 4.0 प्रोजेक्ट में टाइप किया, और यह निश्चित रूप से गलत है! मेरा अनुमान है कि आप 'वापसी (obj! = Null) कोड करना चाहते हैं? obj: DBNull.Value; 'बदले में वापस 'obj? = शून्य? obj: DBNull.Value; 'बस एक एफवाईआई। – jp2code

+0

@ jp2code: निश्चित रूप से, यह सिर्फ एक टाइपो था। धन्यवाद! फिक्स्ड। – abatishchev

2

आप उन्हें संग्रहीत प्रक्रिया में पैरामीटर को डिफ़ॉल्ट कर सकते हैं।

create procedure XXX 
(
    @FirstName nvarchar(50) = null, 
    @LastName nvarchar(50) = null, 
    ... 
) 
+0

यह भी काम करता है, लेकिन मेरी दाल पोर्टेबल नहीं होगा, इसलिए मैं अपने कोड में शून्य मान को संभालने के लिए है। मुझे नहीं पता कि ORACLE पैरामीटर के लिए डिफ़ॉल्ट मानों को अनुमति देता है या नहीं। (+1) वैसे भी – codingbiz

5

थोड़ा पुन: फैक्टरिंग कोड को कम गन्दा बना सकता है। इस

dbParams.Add(SetDBNullIfEmpty("@FirstName", FirstName)); 
dbParams.Add(SetDBNullIfEmpty("@LastName", LastName)); 
dbParams.Add(SetDBNullIfEmpty("@DisplayName", DisplayName)); 
dbParams.Add(SetDBNullIfEmpty("@BirthDate", BirthDate)); 
dbParams.Add(SetDBNullIfEmpty("@Gender", Gender)); 

private SqlParameter SetDBNullIfEmpty(string parmName, string parmValue) 
{ 
    return new SqlParameter(parmName, String.IsNullOrEmpty(parmValue) ? DBNull.Value : (object)parmValue)); 
} 
+0

आपको धन्यवाद – codingbiz