2009-07-02 17 views
11

SqlCommand.ExecuteReader() विधि को कॉल करने का उपयोग करते समय, ReSharper मुझे बताता है कि जब मैं SqlDataReader ऑब्जेक्ट का उपयोग करता हूं तो मेरे पास संभावित NullReference अपवाद होता है।कब SqlCommand.ExecuteReader() वापस शून्य होगा?

निम्न कोड के साथ

तो:

using (SqlConnection connection = GetConnection()) 
{ 
    using (SqlCommand cmd = connection.CreateCommand()) 
    { 
     cmd.CommandText = ; //snip 

     using (SqlDataReader reader = cmd.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       //snip 
      } 
     } 
    } 
} 

while (reader.Read()) लाइन को रेखांकित किया गया है।

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

और रीशेर्पर क्यों सोचेंगे कि यह शून्य हो सकता है, उदाहरण के लिए, जब मैं इसे बिना किसी शून्य के जांच के अनुशंसा करता हूं तो मुझे एसक्यूएल कॉमांड का उपयोग करने देता है? मुझे लगता है कि ExecuteReader विधि पर एक विशेषता है।

उत्तर

11

यह एक झूठी सकारात्मक है।

SqlDataReader.ExecuteReader पर प्रतिबिंबित करते हुए, मैं देख सकता हूं कि पाठक को शून्य के रूप में वापस करने का एकमात्र तरीका यह है कि यदि आंतरिक RunExecuteReader विधि को वापसी के लिए 'झूठी' पास की जाती है, तो यह नहीं है।

SqlDataReader की गहराई में, पाठक कन्स्ट्रक्टर को हमेशा किसी बिंदु पर बुलाया जाता है, इसलिए मुझे पूरा यकीन है कि ExecuteReader को शून्य वापस करने के लिए यह शारीरिक रूप से संभव नहीं है।

2

मुझे उनके साथ कुछ अन्य क्षेत्रों में यह समस्या थी। ऐसा लगता है कि उन्होंने सीएलआर के विभिन्न हिस्सों में कोड पथ का विश्लेषण किया है। जब उन्हें लगता है कि यह शून्य वापस करने के लिए कल्पना करने योग्य है, तो जब वे इसके बारे में शिकायत करते हैं।

विशेष मामले में मैंने शिकायत की, वास्तव में वास्तव में नहीं हो सका। हालांकि, उन्होंने कॉल ग्राफ को एक ऐसी विधि में खोजा जो कुछ परिस्थितियों में शून्य हो सकता है, और शून्य मूल्य अनुमानतः शीर्ष पर प्रचार कर सकता है।

तो, मैं इसे एक रेसर्पर बग कहता हूं (सोचा था कि मैंने इसे पहले सीएलआर बग कहा था)।

0

मैंने एक कारण निर्धारित किया है कि ExecuteReader() शून्य कैसे लौट सकता है।

जिस मामले में मुझे शून्य मिल रही थी, मैंने अपने क्लाइंट को संग्रहीत प्रक्रिया को अद्यतन करने के लिए एक स्क्रिप्ट भेजी थी। मेरे क्लाइंट का एसक्यूएल सर्वर (2000) स्थापित है ताकि डीबी उपयोगकर्ताओं को संग्रहीत प्रक्रिया निष्पादित करने की अनुमति की आवश्यकता हो। जब उन्होंने एसपी को अद्यतन किया तो अनुमति हटा दी गई और फिर से असाइन नहीं किया गया। इस उदाहरण में SqlCommand.ExecuteReader() ने एक शून्य वापस कर दिया।

अनुमति को फिर से निर्दिष्ट करने से इसे ठीक किया गया।

0

मुझे एक समस्या थी जहां मैंने लॉगफाइल के लिए .dbo.sysfiles पूछे और बदले में null प्राप्त किया। मैंने अपने क्लाइंट को सिस्टम उपयोगकर्ता के रूप में कनेक्ट किया था जो सिसडमिन था, सुनिश्चित नहीं था कि क्या हुआ ...

3

रिशेर्पर सही है, यह संभावित रूप से शून्य हो सकता है।

इससे कोई फर्क नहीं पड़ता कि ExecuteReader() के लिए एक विशिष्ट कार्यान्वयन एक शून्य मूल्य को बुलबुला करने की अनुमति नहीं देगा - तथ्य यह है कि IDataReader एक ऑब्जेक्ट है जिसमें शून्य (या इंगित) शून्य हो सकता है।

  • यदि भविष्य में आप IDbCommand के विभिन्न कार्यान्वयन का उपयोग करने का निर्णय लेते हैं तो क्या होगा?
  • क्या होगा यदि उस IDbCommnd कार्यान्वयन के अगले अपडेट में कोड में एक अलग प्रवाह होगा जो शून्य को बुलबुला करने की अनुमति देगा?

आप को पता है कि आदेश इसे सही ढंग से का उपयोग करने के लिए एक इंटरफेस के कार्यान्वयन के अंदर होता है की जरूरत नहीं है - तुम सिर्फ इंटरफेस जानने की जरूरत, और अभी इंटरफ़ेस एक वापसी मान के रूप में अशक्त अनुमति देता है।

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