2010-03-18 13 views
16

मैं एक विरासत ऐप में ADO.NET (.NET 1.1) का उपयोग कर रहा हूं। मुझे पता है कि DataAdapter.Fill() डेटा एडाप्टर को दिए जाने से पहले कनेक्शन को मैन्युअल रूप से खोला नहीं गया है, तो कनेक्शन खोलता है और बंद करता है।क्या DataAdapter.Fill() अपवाद को फेंकने पर अपना कनेक्शन बंद कर देता है?

मेरा प्रश्न: क्या यह कनेक्शन बंद भी करता है अगरफिल() अपवाद का कारण बनता है? (SQL सर्वर के कारण पहुंचा जा सकता है, या जो भी हो)। क्या यह कनेक्शन को रिसाव करता है या क्या यह सुनिश्चित करने के लिए अंत में एक अंतर्निहित खंड है कि कनेक्शन बंद हो रहा है।

कोड उदाहरण:

Dim cmd As New SqlCommand 
Dim da As New SqlDataAdapter 
Dim ds As New DataSet 
cmd.Connection = New SqlConnection(strConnection) 
cmd.CommandText = strSQL 
da.SelectCommand = cmd 
da.Fill(ds) 
+1

इसे जानने के बिना मैं वास्तव में यह मानता हूं कि यह करता है। हालांकि आप कार्यान्वयन को देखने के लिए परावर्तक (http://www.red-gate.com/products/reflector/) का उपयोग कर सकते हैं और देख सकते हैं कि यह अंत में लागू होता है या नहीं। – AxelEckenberger

उत्तर

20

तो कनेक्शन खुला भरण() विधि कहा जाता है से पहले, तो कोई कनेक्शन DataAdapter द्वारा बंद कर दिया नहीं किया जाएगा।

हालांकि, अगर आप कनेक्शन को स्पष्ट रूप से नहीं खोलते हैं, और इसके बजाय डेटा एडाप्टर को भरें() कमांड के भीतर कनेक्शन खोलें और कनेक्शन को त्रुटि पर बंद कर दिया जाएगा। एक नियमित कि बाहर त्रुटि होगा लेखन और फिर कनेक्शन के राज्य की जाँच करके Data Access Strategies Using ADO.NET and SQL

इसके अलावा, इस कोड में प्रदर्शन किया जा सकता है:

इस दस्तावेज की कई स्रोतों, जिनमें से एक यह से गर्भित जा सकता है।

विंडोज फॉर्म ऐप से यह कोड यह साबित करता है। पहला संदेश बॉक्स "ओपन" और दूसरा "बंद" कहेंगे।

   string connString = ""; 
     private void Form1_Load(object sender, EventArgs e) 
     { 
      connString = Properties.Settings.Default.EventLoggingConnectionString; 
      ExplicitlyOpenConnection(); 
      LetDataAdapterHandleIt(); 
     } 

     private void ExplicitlyOpenConnection() 
     { 
      System.Data.SqlClient.SqlConnection cn = new System.Data.SqlClient.SqlConnection(connString); 
      System.Data.DataSet ds = new DataSet(); 
      System.Data.SqlClient.SqlDataAdapter ad = new System.Data.SqlClient.SqlDataAdapter("Select bogusdata from nonexistenttable", cn); 

      cn.Open(); 
      try 
      { 
       ad.Fill(ds); 
      } 
      catch (Exception ex) 
      { 

      } 

      MessageBox.Show(cn.State.ToString()); 
      cn.Close(); 
     } 
     private void LetDataAdapterHandleIt() 
     { 
      System.Data.SqlClient.SqlConnection cn = new System.Data.SqlClient.SqlConnection(connString); 
      System.Data.DataSet ds = new DataSet(); 
      System.Data.SqlClient.SqlDataAdapter ad = new System.Data.SqlClient.SqlDataAdapter("Select bogusdata from nonexistenttable", cn); 

      try 
      { 
       ad.Fill(ds); 
      } 
      catch (Exception ex) 
      { 

      } 
      MessageBox.Show(cn.State.ToString()); 
     } 
+0

ग्रेट, इस उदाहरण के लिए धन्यवाद! – motto

1

यह कनेक्शन बंद नहीं करता है। इस उदाहरण काम करता है और "ARealTable"

  using (SqlConnection conn = new SqlConnection("Data Source=server;Initial Catalog=database;user id=sa; password=password;")) 
      { 
       conn.Open(); 

       try 
       { 
        SqlDataAdapter adap = new SqlDataAdapter("SELECT * FROM NotATable", conn); 
        /* Exception thrown next */ 
        adap.Fill(new DataSet("test")); 
       } 
       catch (Exception) { } 

       using (SqlCommand cmd = new SqlCommand("SELECT TOP 1 Id FROM ARealTable", conn)) 
       { 
        string result = Convert.ToString(cmd.ExecuteScalar()); 
        Console.WriteLine(result); 
       } 
       Console.ReadKey(); 

संपादित की पहचान आउटपुट:

आप पहले से कनेक्शन को खोलते हैं (IDbConnection वस्तु पर खुला बुला), IDataAdapter यह बंद नहीं होगा। हालांकि, अगर आप आईडीटाएडाप्टर को कनेक्शन को पूरी तरह से प्रबंधित करने की अनुमति देते हैं, तो यह बंद हो जाएगा।

+0

हां, यदि आप इसे खोल रहे हैं, तो आप इसे स्वयं बंद करने के लिए ज़िम्मेदार हैं। हालांकि मैं ऐसी स्थिति देख रहा हूं जहां डेटा एडाप्टर मेरे लिए कनेक्शन खोलता है। – motto

+0

उस स्थिति में, यह डेटा एडाप्टर द्वारा बंद कर दिया जाएगा। – scottm

+0

लेकिन फिर यदि आप डेटाएडाप्टर को बंद करने की अनुमति देते हैं तो insertcommand काम करेगा? मैं सहमत हूं कि चयन करें और भरें काम करेंगे। – variable

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

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