2010-03-18 29 views
16

Tôi đang sử dụng ADO.NET (.NET 1.1) trong ứng dụng cũ. Tôi biết rằng DataAdapter.Fill() mở và đóng các kết nối nếu kết nối chưa được mở thủ công trước khi nó được cung cấp cho DataAdapter.DataAdapter.Fill() có đóng kết nối khi ngoại lệ được ném không?

Câu hỏi của tôi: Liệu nó cũng đóng kết nối nếu .Fill() gây ra Ngoại lệ? (do không thể truy cập máy chủ SQL hoặc bất kỳ thứ gì). Nó có rò rỉ một kết nối hay nó có một điều khoản cuối cùng được xây dựng trong để đảm bảo kết nối đang được đóng lại.

Mã số Ví dụ:

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

Mà không biết chính xác, tôi sẽ giả định rằng nó có, mặc dù. Tuy nhiên bạn có thể sử dụng Reflector (http://www.red-gate.com/products/reflector/) để xem xét việc triển khai và xem liệu nó có thực hiện cuối cùng hay không. – AxelEckenberger

Trả lời

20

Nếu kết nối được mở trước khi các phương pháp Fill() được gọi, thì không có, kết nối sẽ không được đóng lại bằng DataAdapter.

Tuy nhiên, nếu bạn không mở kết nối một cách rõ ràng, và thay vào đó hãy để DataAdapter mở và đóng kết nối trong lệnh Fill(), thì kết nối sẽ bị đóng do lỗi.

này có thể ngụ ý từ nhiều nguồn tài liệu, trong đó có một này: Data Access Strategies Using ADO.NET and SQL

Hơn nữa, điều này có thể được chứng minh trong mã bằng cách viết một thói quen mà sẽ báo lỗi ra ngoài và sau đó kiểm tra Nhà nước của kết nối.

Mã này từ ứng dụng Windows Forms chứng minh điều đó. Hộp tin nhắn đầu tiên sẽ hiển thị "Mở" và hộp thứ hai "Đã đóng".

   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

Tuyệt vời, cảm ơn ví dụ này! – motto

1

không phải là đóng kết nối. Ví dụ này hoạt động và kết quả đầu ra Id của "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(); 

Edit:

Nếu bạn mở kết nối trước khi tay (gọi mở trên đối tượng IDbConnection), các IDataAdapter sẽ không đóng nó lại. Tuy nhiên, nếu bạn cho phép IDataAdapter quản lý toàn bộ kết nối, nó sẽ bị đóng.

+0

Có, nếu bạn mở nó, bạn có trách nhiệm tự đóng nó. Tuy nhiên tôi đang xem xét một tình huống mà DataAdapter mở kết nối cho tôi. – motto

+0

Trong trường hợp đó, nó sẽ được đóng bởi DataAdapter. – scottm

+0

nhưng sau đó nếu bạn cho phép dataadapter để xử lý đóng sau đó sẽ làm việc insertcommand? Tôi đồng ý chọn và điền sẽ hoạt động. – variable

Các vấn đề liên quan