2011-02-10 18 views
71

क्या शून्य और सिस्टम के बीच कोई अंतर है। DBNull.Value? यदि हां, तो यह क्या है?शून्य और सिस्टम के बीच क्या अंतर है। DBNull.Value?

मैं अब इस व्यवहार देखा -

while (rdr.Read()) 
{ 
    if (rdr["Id"] != null) //if (rdr["Id"] != System.DBNull.Value) 
    { 
     int x = Convert.ToInt32(rdr["Id"]); 
    } 
} 

जब मैं डेटाबेस एक एसक्यूएल DataReader का उपयोग करने से डेटा पुनः प्राप्त है, हालांकि कोई मूल्य नहीं if(rdr["Id"] != null) लौटे true लौटे है और अंत में पूर्णांक के रूप में एक अशक्त कास्टिंग के लिए एक अपवाद फेंक दिया।

लेकिन, अगर मैं if (rdr["Id"] != System.DBNull.Value)false का उपयोग करता हूं।

शून्य और सिस्टम के बीच क्या अंतर है। DBNull.Value?

+0

ठीक है, वे असंबंधित हैं। एक 'System.Data' में एक वर्ग का एक स्थिर उदाहरण है, और दूसरा एक विशेष मूल्य है जो एक संदर्भ की कमी को दर्शाता है। उनके पास एक दूसरे के साथ कुछ लेना देना नहीं है। क्या आप इस बारे में विस्तार से बता सकते हैं कि आप किस बारे में उलझन में हैं? क्या आपका असली सवाल है "डेटारोज़' और 'डेटा रीडर' क्यों 'शून्य' के बजाय खुद के अंदर 'डीबीएनयूएल.वैल्यू' डालते हैं?" – mquander

+0

ठीक है, मेरी शुरुआत में यह नहीं था लेकिन आपने जो कहा उससे सीखने के बाद, मैं उत्सुक हूं। क्या आप मुझे बता सकते हैं कि डेटारो और डेटा रीडर ने डीबीएनयूएल क्यों डाला। शून्य के बजाए खुद में वैल्यू? – pavanred

+0

मुझे यकीन नहीं है कि मैं खुद हूं। यहां एक उत्तर दिया गया है: http://stackoverflow.com/questions/4488727/what-is-the-point-of-dbnull/4488758#4488758 यह भी संभव है कि शून्य के बराबर मूल्य प्रकार सी # के आसपास थे, तो यह अधिक होता 'शून्य' से निपटने में परेशानी। – mquander

उत्तर

89

खैर, null किसी भी प्रकार का एक उदाहरण नहीं है। इसके बजाय, यह एक अवैध संदर्भ है।

हालांकि, System.DbNull.Value, (System.DbNull एक सिंगलटन है और System.DbNull.Value आप उस वर्ग के एक उदाहरण के लिए एक संदर्भ देता है) System.DbNull का एक उदाहरण है कि डेटाबेस में अस्तित्वहीन * मूल्यों का प्रतिनिधित्व करता है के लिए एक वैध संदर्भ है।

* हम आमतौर पर null कहेंगे, लेकिन मैं इस मुद्दे को उलझाना नहीं चाहता हूं।

तो, दोनों के बीच एक बड़ा वैचारिक अंतर है। कीवर्ड null एक अमान्य संदर्भ का प्रतिनिधित्व करता है। कक्षा System.DbNull डेटाबेस फ़ील्ड में एक nonexistent मान का प्रतिनिधित्व करता है। आम तौर पर, हमें एक ही चीज़ का उपयोग करने से बचने की कोशिश करनी चाहिए (इस मामले में null) दो बहुत ही अलग अवधारणाओं का प्रतिनिधित्व करने के लिए (इस मामले में एक डेटाबेस क्षेत्र में एक गैर-विशिष्ट मूल्य बनाम अमान्य संदर्भ)।

ध्यान रखें, यही कारण है कि बहुत से लोग सामान्य रूप से null object pattern का उपयोग करने का समर्थन करते हैं, जो वास्तव में System.DbNull का एक उदाहरण है।

+31

+1 एक व्यावहारिक उदाहरण: यदि आप 'आईडीबीकॉमैंड.एक्सक्यूटस्कालर()' का उपयोग करते हैं, तो यह या तो शून्य (कोई रिकॉर्ड नहीं लौटाया जा सकता है) या 'डीबीएनयूएल' (पहले कॉलम रिकॉर्ड एक 'nonexistent मान' है)। 'डीबीएनयूएल 'के बिना आप एक दूसरे से अंतर नहीं कर पाएंगे। –

+0

मैं दृढ़ता से ऐसी भाषा का उपयोग करने की अनुशंसा करता हूं जो नल के उपयोग को रोकता है, और बिल्कुल 0 अतिरिक्त लागत पर ऐसा करता है। जीवन "शून्य ऑब्जेक्ट पैटर्न" के लिए बहुत छोटा है – nicolas

+2

एक शून्य संदर्भ पूरी तरह से मान्य है। ☺ – IllidanS4

5

DBNull.Value .NET डेटाबेस प्रदाता डेटाबेस में एक शून्य प्रविष्टि का प्रतिनिधित्व करने के लिए वापस आते हैं। DBNull.Value शून्य नहीं है और डेटाबेस पंक्ति से पुनर्प्राप्त कॉलम मानों के लिए शून्य पर तुलना काम नहीं करेगी, आपको हमेशा डीबीएनयूएल की तुलना करनी चाहिए। वैल्यू।

http://msdn.microsoft.com/en-us/library/system.dbnull.value.aspx

+0

पेजों में स्थानांतरित कर दिया। आपको डेटाबेस में एक शून्य पैरामीटर पास करने के लिए DBNull.Value का भी उपयोग करना चाहिए, अन्यथा यह व्याख्या किया जा सकता है क्योंकि पैरामीटर पारित नहीं किया गया था। –

+0

डीबीएनयूएल * नहीं * "डेटाबेस क्या लौटाता है" - यह बस एडीओ.NET इसे समझने का विकल्प चुनता है; व्यक्तिगत रूप से मुझे यकीन नहीं है कि यह व्याख्या बहुत मूल्यवान है –

+0

@MarcGravell हाँ, मार्क, आप सही हैं। मैंने गलत तरीके से कहा। एएसपी.नेट डाटाबेस नल कॉलम वैल्यू को डीबीएनयूएल में अनुवाद करता है। वैल्यू –

3

डेटारो में एक विधि है जिसे IsNull() कहा जाता है जिसे आप कॉलम का परीक्षण करने के लिए उपयोग कर सकते हैं यदि उसके पास शून्य मान है - जो डेटाबेस द्वारा देखा गया है।

DataRow["col"]==null सभी false होंगे।

उपयोग

DataRow r; 
if (r.IsNull("col")) ... 

बजाय।

2

नल सी ++ में शून्य सूचक के समान है। तो यह संदर्भ है जो किसी भी मान पर इंगित नहीं करता है।

DBNull.Value पूरी तरह से अलग है और स्थिर है जो फ़ील्ड मान में न्यूल होने पर वापस लौटाया जाता है।

20
DBNull class के प्रलेखन से

:

एक DBNull वस्तु के साथ एक वस्तु उन्मुख प्रोग्रामिंग भाषा में अशक्त की धारणा भ्रमित न हों। ऑब्जेक्ट उन्मुख प्रोग्रामिंग भाषा में, शून्य का अर्थ किसी ऑब्जेक्ट के संदर्भ की अनुपस्थिति है। डीबीएनयूएल एक अनियमित संस्करण या गैर-डेटाबेस डेटाबेस कॉलम का प्रतिनिधित्व करता है।

8

DBNull.Value से निपटने के लिए परेशान है।

मैं स्थिर विधियों का उपयोग करता हूं जो जांचता है कि यह डीबीएनयूएल है या फिर मान वापस कर दें।

SqlDataReader r = ...; 
String firstName = getString(r[COL_Firstname]); 

private static String getString(Object o) { 
    if (o == DBNull.Value) return null; 
    return (String) o; 
} 

इसके अलावा, जब एक DataRow में मूल्यों डालते समय, आप "अशक्त" उपयोग नहीं कर सकते, तो आप DBNull.Value उपयोग करना होगा।

"शून्य" के दो प्रतिनिधित्व कोई स्पष्ट लाभ के लिए एक खराब डिजाइन है।