अशक्त और System.DBNull.Value के बीच अंतर क्या है?


92

क्या null और System.DBNull.Value के बीच कोई अंतर है? यदि हां, तो यह क्या है?

मैंने इस व्यवहार पर ध्यान दिया -

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

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

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

अशक्त और System.DBNull.Value के बीच क्या अंतर है?


खैर, वे असंबंधित हैं। एक में एक वर्ग का एक स्थिर उदाहरण है System.Data, और दूसरा एक विशेष मूल्य है जो एक संदर्भ की कमी को दर्शाता है। उनका एक-दूसरे से कोई लेना-देना नहीं है। क्या आप इस बारे में विस्तार से बता सकते हैं कि आप किस उलझन में हैं? क्या आपका असली सवाल "क्यों DataRowsऔर क्या इसके बजाय खुद के अंदर DataReadersडाल दिया DBNull.Valueहै null?"
mqp

ठीक है, मेरी शुरुआत में यह नहीं था लेकिन आपने जो कहा उससे सीखने के बाद, मैं उत्सुक हूं। क्या आप मुझे बता सकते हैं कि DataRows और DataReaders ने NBN के बजाय DBNull.Value को अपने आप में क्यों रखा है?
pavanred

मुझे खुद पर यकीन नहीं है। यहाँ एक उत्तर है: stackoverflow.com/questions/4488727/what-is-the-point-of-dbnull/… यह भी संभव है कि इससे पहले कि अशक्त मूल्य प्रकार C # में आस-पास थे, इससे निपटने के लिए अधिक परेशानी होती null
mqp

1
मैं एक जवाब यहाँ था, लेकिन मैंने महसूस किया कि यह के लिए अधिक उपयुक्त था stackoverflow.com/questions/4488727/what-is-the-point-of-dbnull - तो मैं इसे ले जाया गया
मार्क Gravell

जवाबों:


117

खैर, nullकिसी भी प्रकार का उदाहरण नहीं है। बल्कि, यह एक अमान्य संदर्भ है।

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

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

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

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


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

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

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

@ C.Evenhuis खैर, एक और आम सलाह है: एक फ़ंक्शन को केवल एक प्रकार का मान वापस करना चाहिए। यही कारण है कि लोग अच्छी तरह से टाइप किए गए टाइपस्क्रिप्ट कोड पसंद करते हैं। "निष्पादन की स्थिति क्या है" "कम्प्यूटेशनल परिणाम क्या है" से अलग है। अर्थात। वे इस फ़ंक्शन को किसी और तरीके से लागू करने का निर्णय ले सकते हैं (शायद एक आउट पैरामीटर या HTTP अनुरोध प्रतिक्रिया objs के समान ऑब्जेक्ट)। निश्चित रूप से, यह वास्तव में एक वांछित जटिलता नहीं है, लेकिन अगर उन्होंने ऐसा किया होता, तो शायद DbNull के बजाय नल का उपयोग किया जा सकता था।
klenium

21

DBNull वर्ग के प्रलेखन से :

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


11

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 में मान सम्मिलित करते हैं, तो आप "null" का उपयोग नहीं कर सकते, आपको DBNull.Value का उपयोग करना होगा।

"शून्य" के दो निरूपण हैं जो बिना किसी स्पष्ट लाभ के लिए एक खराब डिज़ाइन है।


2
घृणा की भावना हम फिर से साझा करते हैं: आपका अंतिम बयान केवल यह दिखाने के लिए यहां दिखाने की विडंबना से ट्रम्प किया गया है और अपने उपयोगकर्ता नाम का पता लगा रहा है "घृणा"
Iofacture

5

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

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


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

1
DBNull "डेटाबेस रिटर्न क्या है" नहीं है - यह बस कैसे ADO.NET इसे व्याख्या करने के लिए चुनता है; व्यक्तिगत रूप से मुझे यकीन है कि इस व्याख्या बहुत ही मूल्यवान है नहीं कर रहा हूँ
मार्क Gravell

@MarcGravell हाँ, मार्क, आप सही हैं। मैंने उस गलत शब्द को कहा। ASP.NET, डेटाबेस null कॉलम वैल्यू को DBNull.Value
James Michael Hare

3

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

DataRow["col"]==nullक्या होगा false?

उपयोग

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

बजाय।


3

नल C ++ में शून्य पॉइंटर के समान है । तो यह एक संदर्भ है जो किसी भी मूल्य की ओर इशारा नहीं करता है

DBNull.Valueपूरी तरह से अलग है और एक स्थिरांक है जो एक क्षेत्र मान में NULL होने पर वापस आ जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.