2012-01-26 13 views
7

बंद होना चाहिए यह मेरे पास कोड है।इस कमांड से पहले से ही एक खुला डेटा रीडर है जो पहले

/// <summary> 
/// Method calls stored procedure and fills DataSet of contacts associated with Lead 
/// </summary> 
/// <param name="leadID">The ID associated with a Lead</param> 
/// <returns>contacts list as DataSet</returns> 
public static DataSet GetContactResultSetByLead(int leadID) 
{ 
    SqlCommand Sqlmd = new SqlCommand("dbo.proc_contact"); 
    Sqlmd.CommandType = CommandType.StoredProcedure; 
    Sqlmd.Parameters.Add("@LeadInfoID", SqlDbType.Int).Value = leadID; 

    Sqlmd.Connection = m_ConStr; 
    SqlDataAdapter da = new SqlDataAdapter(Sqlmd); 

    DataSet data = new DataSet(); 
    try 
    { 
     da.Fill(data); 
    } 

    finally 
    { 
     m_ConStr.Close(); 
    } 

    return data; 
} 
+0

'm_ConStr' क्या है? –

+0

इस लाइन को बदलें Sqlmd.Parameters.Add ("@ LeadInfoID", SqlDbType.Int)। Value = leadID; Sqlmd.Parameters.AddWithValue ("@ LeadInfoID", लीडआईडी); यदि आप ग्लोबल कनेक्ट रखना चाहते हैं तो उस कनेक्शन के राज्य को खोलें यदि खोलें तो इसे इस्तेमाल करने से पहले इसे बंद करें। अपने कोड का सम्मान करें और अलग-अलग विविध नामों का उपयोग करें ....! एक उपयोग के आसपास अपने कनेक्शन लपेटें() {} – MethodMan

+1

एसक्लएमडी दा। भर कॉल के दौरान निष्पादित किया जाएगा। m_ConStr एक खराब नामित चर प्रतीत होता है - ऐसा लगता है कि यह कनेक्शन कनेक्शन को संदर्भित करता है, न कि कनेक्शन स्ट्रिंग। – RQDQ

उत्तर

9

आपकी समस्या यह है कि आपके पास स्पष्ट रूप से m_ConStr का एक उदाहरण है; यदि विधि को समवर्ती रूप से कहा जाता है तो उनमें से केवल एक कनेक्शन का उपयोग करने में सक्षम होगा और दूसरा आप प्राप्त अपवाद के साथ असफल हो जाएगा।

बजाय इस पद्धति का उपयोग करें:

using (SqlConnection conn = new SqlConnection()) 
{ 
    conn.Open(); 
    Sqlmd.Connection = conn; 
    SqlDataAdapter da = new SqlDataAdapter(Sqlmd); 
    //...etc 
} 

दूसरे शब्दों में, वर्ग के लिए एक वैश्विक चर के रूप में संबंध को परिभाषित नहीं है।

+0

"वैश्विक चर के रूप में कनेक्शन को परिभाषित न करें": लेकिन फिर कैसे से बचें जब भी मुझे एक एसपी निष्पादित करना होता है तो कनेक्शन बनाएं और खोलें। मेरे मामले में मुझे बहुत सारे स्पैम निष्पादित करना होगा, और बिना किसी कनेक्शन के इंस्टॉलेशन के, विकल्प हर बार बनाना और खोलना है। कोई संकेत? – ff8mania

1

आप एक से अधिक actice परिणाम सेट (उर्फ MARS) को चलाने के लिए कोशिश कर रहे हैं।

दो संभव समाधान दिमाग में आते हैं:

  1. ओपन अपने GetContractResultSetByLead में एक नया कनेक्शन
  2. अपने डेटाबेस सर्वर (ऊपर के लिंक में वर्णित) पर मार्स सक्षम खोलें।
+0

आप इसे web.config में कनेक्शन स्ट्रिंग में जोड़ने का भी प्रयास कर सकते हैं: connectionString = "MultipleActiveResultSets = True; user = ..." – Nestor

5

मेरा सुझाव है कि आप स्क्लोनकनेक्शन के उचित निपटान को सुनिश्चित करने के लिए ब्लॉक का उपयोग कर सकते हैं।

using (SqlConnection conn = new SqlConnection()) 
{ 
    conn.Open(); 
    Sqlmd.Connection = conn; 
    SqlDataAdapter da = new SqlDataAdapter(Sqlmd); 
    Dataset ds = new Datasest 
    da.Fill(ds) 
} 

दूसरी तरफ आप अपने कनेक्शन में मार्स संपत्ति भी सेट कर सकते हैं, यदि आपको आवश्यकता हो।

SqlConnection m_ConStr;= new SqlConnection("Server= serverName;Database=yourDatabase; 
     MultipleActiveResultSets=true;"); 
+2

कनेक्शन स्थानीय रूप से घोषित किया जाना चाहिए (यदि आप साझा उदाहरण का उपयोग करते हैं तो सभी प्रकार के दुष्प्रभाव होंगे)। साथ ही, आप कनेक्शन के जीवनकाल को प्रबंधित करने के लिए केवल एक उपयोग कथन क्यों नहीं लगाएंगे? – RQDQ

+1

यह भी अच्छा सुझाव है :) ठीक है इसे संपादित करेगा :) –

+1

आपको बहुत बहुत धन्यवाद – Marcus3329

5

अपने अल्पकालिक IDisposable की सभी वस्तुओं वहाँ की कमी एक "का उपयोग कर रहे हैं"। विस्तार से, यह संभव है कि आपने कुछ ऐसा किया है:

var reader = anotherCommand.ExecuteReader(); 
... 

लेकिन यह पाठक को निपटाने/बंद नहीं करता है। हम कैसे बाहर निकलने के

using(var reader = anotherCommand.ExecuteReader()) { 
    ... 
} 

कौन सा पाठक बंद कर देता है, भले ही: यदि यह मामला है, "का उपयोग" जोड़ें। आदेश, कनेक्शन, पाठक और लेनदेन सभी डिस्पोजेबल हैं और आमतौर पर सभी "उपयोग" का उपयोग करना चाहिए।

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

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