2012-04-13 16 views
8

यदि मैं अलग-अलग तालिकाओं पर एकाधिक चयन क्वेरी चलाने के लिए चाहता हूं, तो क्या मैं उन सभी के लिए समान SqlDataReader और SqlConnection का उपयोग कर सकता हूं ?? निम्नलिखित बुद्धिमान होगा ?? (मैंने इसे तेजी से टाइप किया है, इसलिए इसमें कोशिश/पकड़ की कमी है):SqlConnection और SqlDataReader का पुन: उपयोग

MySqlCommand myCommand = new MySqlCommand("SELECT * FROM table1", myConnection); 

myConnection.Open(); 
SqlDataReader myDataReader = myCommand.ExecuteReader(); 

while(myReader.Read()) 
{ 
    //Perform work. 
} 

myCommand.commandText = "SELECT * FROM table2"; 

myReader = myCommand.ExecuteReader(); 

while(myReader.Read()) 
{ 
    //Perform more work 
} 

myReader.Close(); 
myConnection.Close(); 

बहुत बहुत धन्यवाद।

+0

आपको एंटिटी फ्रेमवर्क का उपयोग करना चाहिए। –

+1

शायद सहायक: http://stackoverflow.com/questions/9705637/executereader-requires-an-open-and-available-connection-the-connections-curren/9707060#9707060 –

+1

क्या आपका उपरोक्त कोड कोई त्रुटि देता है? यदि नहीं, तो यह निश्चित रूप से ठीक है। – sarwar026

उत्तर

20

आप उनमें से प्रत्येक के लिए एक ही कनेक्शन का उपयोग कर सकते हैं, जब तक कि आप अलग-अलग धागे से समान कनेक्शन पर एक साथ कई प्रश्न निष्पादित करने का प्रयास नहीं करते हैं।

डेटा रीडर के लिए, आप वास्तव में पाठक का पुन: उपयोग नहीं कर रहे हैं, ExecuteReader पर प्रत्येक कॉल एक नए पाठक का एक नया उदाहरण देता है, जो आप फिर से उपयोग कर रहे हैं वह चर है जो पाठक के संदर्भ को बनाए रखता है। यहां एक समस्या निहित है, आप केवल अंतिम पाठक को स्पष्ट रूप से बंद कर रहे हैं और बाद में कुछ समय बाद जीसीएड को छोड़कर छोड़ रहे हैं।

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

आप try/finally ब्लॉक का उपयोग सुनिश्चित करें कि आप यहां संसाधनों को साफ, या चाहिए, भले ही वहाँ एक अपवाद है कि कोड के बाकी को रोकता है संसाधन सुनिश्चित करने के लिए सफाई using बयानों का उपयोग करने के लिए अपने कोड के लिए एक त्वरित परिवर्तन है निष्पादन से।

using (var myConnection = GetTheConnection()) 
{ 
    myConnection.Open(); 

    var myCommand = new MySqlCommand("SELECT * FROM table1", myConnection)) 
    using (var myDataReader = myCommand.ExecuteReader()) 
    { 
    while(myReader.Read()) 
    { 
     //Perform work. 
    } 
    } // Reader will be Disposed/Closed here 

    myCommand.commandText = "SELECT * FROM table2"; 
    using (var myReader = myCommand.ExecuteReader()) 
    { 
    while(myReader.Read()) 
    { 
     //Perform more work 
    } 
    } // Reader will be Disposed/Closed here 
} // Connection will be Disposed/Closed here 

नोट: GetTheConnection जो भी तंत्र आप अपने कनेक्शन उदाहरण प्राप्त करने के लिए प्रयोग कर रहे हैं के लिए सिर्फ एक स्थान धारक कार्य है।

+0

धन्यवाद। तो मुझे लगता है कि मुझे हर निष्पादन के बाद केवल पाठक वस्तु को बंद करने की आवश्यकता है। – PaulG

+1

दरअसल मैं एसक्यूएल कॉमांड के लिए पैरामीटर की आपूर्ति कर रहा हूं, अनुमान लगाता हूं कि मुझे अपने कॉमांड का उपयोग करना चाहिए। पैरामीटर। क्लीयर()। बहुत बहुत धन्यवाद। – PaulG

+2

@PaulG, अंगूठे के नियम के रूप में जब भी एक वर्ग IDISposable लागू करता है तो आपको जितनी जल्दी हो सके इसे निपटाना चाहिए। पाठकों के मामले में, वे डेटाबेस सर्वर संसाधनों को तब तक जोड़ते हैं जब तक कि वे बंद या डिस्पोजेड न हों, ताकि आप उनके साथ समाप्त होने के तुरंत बाद निपटान करना चाहें। अब मुझे लगता है कि आप MySQL का उपयोग कर रहे हैं, इसलिए मुझे नहीं पता कि संसाधन का उपयोग क्या है, लेकिन सर्वर आधारित डीबीएमएस सिस्टम जैसे ओरेकल या एसक्यूएल सर्वर के लिए यह मामला है, और आपको हमेशा यह मानना ​​चाहिए कि यह मामला है। –

2

मैं आम तौर पर एडाप्टर का उपयोग करता हूं इसलिए मैं पाठक के विवरण पर जंगली हूं, लेकिन मुझे लगता है कि आप सही रास्ते पर हैं।

आपके कोड में नोट का एक आइटम यह है कि ExecuteReader पर प्रत्येक कॉल एक नया डेटा रीडर उत्पन्न करना चाहिए। आप परिवर्तनीय नाम का पुन: उपयोग कर रहे हैं, लेकिन मौजूदा पाठक का संदर्भ त्याग दिया गया है और प्रत्येक कॉल पर एक नए द्वारा प्रतिस्थापित किया गया है। प्वाइंट होने के नाते, एक नया प्राप्त करने के लिए ExecuteReader का उपयोग करने से पहले पिछले पाठक को बंद करें।