2009-03-06 12 views
6

इसी तरह के प्रश्न हैं लेकिन उत्तर वे नहीं थे जिन्हें मैं ढूंढ रहा था। यदि संदर्भ शून्य है या कोई मान अभी तक असाइन नहीं किया गया है, तो मैं SQL सर्वर डेटाबेस में NULL का मान डालना चाहता हूं। फिलहाल मैं अशक्त के लिए परीक्षण कर रहा हूँ औरपरिवर्तनीय मानों से SQL सर्वर डेटाबेस में NULL मानों को सम्मिलित करना

तरह
String testString = null; 

if (testString == null) 
{ 
    command.Parameters.AddParameter(new SqlParameter("@column", DBNull.Value); 
} 
else 
{ 
    command.Parameters.AddParameter(new SqlParameter("@column", testString); 
} 

यह लग रहा है और मेरे लिए अविश्वसनीय रूप से अनाड़ी लगता है यह लग रहा है। मेरे पास कुछ मूल्य हैं जो मैं डेटाबेस में डाल रहा हूं और उपरोक्त की तरह सभी का परीक्षण करने के लिए बहुत verbose है। क्या यह किसी भी तरह से इसे संभाल नहीं करता है। मैंने सोचा कि शायद मैं स्ट्रिंग का विरोध करने के रूप में स्ट्रिंग का उपयोग करता हूं लेकिन यह भी काम नहीं करता है। चारों ओर देखकर मुझे ऐसे लेख मिले जो नलबल प्रकारों का उपयोग करने के बारे में बात करते हैं।

System.Nullable<T> variable 

यह प्राइमेटिव्स, int ?, char के लिए काम करता प्रतीत होता है? दोगुना? और बूल? तो यह उन लोगों के लिए काम कर सकता है लेकिन तारों के बारे में क्या? क्या मुझसे कोई चूक हो रही है। आदिम मूल्यों और स्ट्रिंग मानों के लिए मुझे किस प्रकार का उपयोग करना चाहिए ताकि मुझे उन्हें डालने से पहले बार-बार मूल्यों का परीक्षण न करना पड़े।

संपादित करें: इससे पहले कि मुझे टर्नरी ऑपरेटरों के बारे में बहुत अधिक जवाब मिलें। मैं उन्हें पसंद करता हूं लेकिन इस संदर्भ में नहीं। मुझे उस मूल्य का परीक्षण करने की आवश्यकता नहीं है और उस अतिरिक्त तर्क के साथ, जब उस तरह की चीज को नेट फ्रेमवर्क में कम किया जा सकता था और यदि मुझे पता था कि किस प्रकार के देना है तो यह इसे प्राप्त करेगा मुक्त करने के लिए।

संपादित करें: ठीक है, तो लोग मुझे हमले की योजना बनाने में मदद करते हैं। मैं अपने प्राइमेटिव्स (int ?, double? आदि) के लिए Nullable का उपयोग करूंगा और मेरे स्ट्रिंग्स के लिए मैं स्ट्रिंग का उपयोग करूंगा लेकिन ?? परीक्षा। यह चीजों को कम verbose रखता है। क्या यहां कुछ भी है जो मैं यहां लापता हूं, जैसे कुछ अर्थशास्त्र खोना?

उत्तर

11

टर्नरी से भी बेहतर डबल-प्रश्न-चिह्न (??) ऑपरेटर है। पहला गैर-शून्य मूल्य लेता है।तो:

string x = null; 
command.Parameters.AddParameter(
    new SqlParameter("@column", (object)x ?? DBNull.Value); 

आप DBNull.Value के एक मूल्य के साथ एक parm देना होगा, लेकिन

string x = "A String"; 
command.Parameters.AddParameter(
    new SqlParameter("@column", (object)x ?? DBNull.Value); 

आप के साथ मूल्य के रूप में "एक स्ट्रिंग" एक parm देंगे।

+1

कंपाइलर इस पर चकित करेगा क्योंकि यह स्ट्रिंग से डीबीएनयूएल में पूरी तरह से परिवर्तित नहीं हो सकता है। – LukeH

+0

आप सही हैं। आपको किसी ऑब्जेक्ट में स्ट्रिंग (x) को कम करने की आवश्यकता है। संपादित उदाहरण। –

+0

इसका कोई प्रशंसक नहीं है, क्योंकि यह पैरामीटर के लिए गलत प्रकार का अनुमान लगाने के लिए आसान बनाता है। एक अधिभार के माध्यम से पैरामीटर प्रकार निर्दिष्ट करना बेहतर होगा जो 'SqlDbType' enum के लिए पूछता है। –

0

शायद टर्नरी ऑपरेटर कुछ उपयोगी है जो आपको उपयोगी लगता है।

0

मैं कभी कभी क्या, यह है:

command.Parameters.Add ("@column", SqlDbType.VarChar).Value = DBNull.Value; 

if(String.IsNullOrEmpty (theString) == false) 
{ 
    command.Parameters["@column"].Value = theString; 
} 
3

Nullable पुरातन के लिए महान काम करता है। मुझे स्ट्रिंग के व्यवहार का परीक्षण करना होगा, लेकिन कम से कम अपने कोड को साफ करने के लिए एक विकल्प स्ट्रिंग की एक विस्तार विधि को परिभाषित करना होगा।

आप का उपयोग कर सकते हैं ?? तार के लिए ऑपरेटर:

command.Parameters.AddParameter (नई SqlParameter ("@ कॉलम", myNull ?? (वस्तु) DBNull.Value);

?? पहले आइटम देता है अगर यह रिक्त नहीं है, अन्य बुद्धिमान यह दूसरे मद देता है।

संपादित

कोड फिक्स्ड ऊपर तो यह आप एक वस्तु को DBNull.Value कास्ट करने के लिए की जरूरत है संकलित कर देगा।

+0

कंपाइलर इस पर चकित करेगा क्योंकि यह स्ट्रिंग से डीबीएनयूएल में पूरी तरह से परिवर्तित नहीं हो सकता है। – LukeH

+0

मुझे विश्वास है कि आप testString का उपयोग कर सकते हैं ?? (स्ट्रिंग) डीबीएनयूएल। वैल्यू। –

+0

कैसे ((ऑब्जेक्ट) testString के बारे में) ?? DBNull.Vale – recursive

0

मैं मानता हूँ कि यह अनाड़ी है और थोड़ा दुर्भाग्यपूर्ण है कि SqlParameter.Value DbNull पर सेट किया जाना चाहिए। Value। लेकिन थर्म ई इसके चारों ओर कोई रास्ता नहीं है इसलिए आपको शून्य के लिए परीक्षण के साथ रहना होगा।

0

Nullable<T>String पर लागू नहीं किया जा सकता है क्योंकि यह एक संदर्भ प्रकार है और मूल्य प्रकार नहीं है।

+0

हाय। बस इसे देखा, यह निराशाजनक है कि स्ट्रिंग के विपरीत स्ट्रिंग अभी भी एक संदर्भ प्रकार है। जाहिर है यह एक उपनाम है लेकिन फिर उदाहरण के लिए एक = "हैलो" स्ट्रिंग; स्ट्रिंग बी = "एच"; बी + = "ello"; फिर एक == बी सत्य देता है क्योंकि यह उनके मूल्यों की तुलना करता है। दिलचस्प। – uriDium

+0

हां और नहीं - एक अच्छा कारण है कि स्ट्रिंग एक संदर्भ प्रकार क्यों है और मूल्य प्रकार नहीं है (जॉन स्कीट की कुछ चीज़ें देखें जो वह उस क्षेत्र में समर्थक हैं); ऐसे मामलों के लिए जिन्हें आपने निर्दिष्ट किया है, यही कारण है कि उन्होंने स्ट्रिंगबिल्डर वर्ग बनाया। –

0

उदाहरण:

if (txtDisplayName.Text != "") 
{ 
    insert into table (id,display_name) values ('" + txtID.Text + "','" + txtDisplayName.Text + "'); 
} 
else 
{ 
    insert into table (id) values ('" + txtID.Text + "'); 
} 

यह null डाल देंगे।

+0

हाय, स्टैक ओवरफ़्लो में आपका स्वागत है! यह कोड का अपूर्ण स्निपेट है। – Jesse

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