2009-01-22 6 views
9

Có ai biết nếu phương pháp SqlDataAdapter.Dispose thực sự đóng hoặc hủy bỏ bất kỳ SqlConnections? Tôi tải lên Reflector và tôi thấy rằng SqlDataAdapter thừa kế từ DbDataAdapter. Nếu tôi tháo rời và xem xét phương thức vứt bỏ trong lớp đó, dường như không có sự loại bỏ bất kỳ SqlConnections nào. Tôi cho rằng tôi có thể viết một bài kiểm tra cho điều này, nhưng tôi nghĩ rằng tôi sẽ yêu cầu để xem nếu có ai có bất kỳ cái nhìn sâu sắc về điều này.SqlDataAdapter.Dispose thực sự đóng một SqlConnection liên quan?

Trả lời

10

Điều đầu tiên cần lưu ý là DataAdapter không quản lý và đóng kết nối của bạn trong một số trường hợp. Ví dụ, nếu bạn đang sử dụng một DataAdapter có lẽ bạn đang hoạt động trên DataTables/DataSets bằng cách sử dụng các hàm .Fill() và .Update().

Từ .Fill() docs:

Đối tượng kết nối gắn liền với câu lệnh SELECT phải có giá trị, nhưng nó không cần phải được mở. Nếu kết nối được đóng trước khi Fill được gọi, nó được mở để truy xuất dữ liệu, sau đó đóng lại. Nếu kết nối được mở trước khi Fill được gọi, nó vẫn mở.

.Update() docs không đề cập đến bất kỳ điều gì về kết nối, vì vậy tôi mong muốn quản lý nó theo cách thủ công.

Bây giờ bạn đã hỏi cụ thể về phương thức Dispose(). Giống như Cập nhật, Dispose() docs không đề cập cụ thể đến kết nối, vì vậy tôi mong muốn phải đóng nó theo cách thủ công.

Cuối cùng, chúng ta có thể cải thiện trên mã Bob King hơi như thế này:

Using conn as New SqlConnection(""), _ 
     adapter as New SqlDataAdapter() With {.Connection = conn} 
    'Do stuff 
End Using 

Hoặc trong C#:

using (SqlConnection conn = new SqlConnection("")) 
using (SqlDataAdapter adapter = new SqlDataAdapter() {Connection = conn}) 
{ 
    // Do stuff 
} 

Không phải 100% Tôi có cú pháp khởi tạo cho adapter đúng, nhưng tôi đã nhập trực tiếp vào cửa sổ trả lời. Tôi sẽ sửa sau nếu cần.

+0

Hmm, Joel, tôi không bao giờ mới bạn có thể khai báo nhiều IDisposables trong cùng một tuyên bố sử dụng. Đó là khá trơn! –

+0

Ngoài ra, tôi nghĩ rằng phiên bản C# của Trình khởi tạo đối tượng không sử dụng hàng đầu "." http://weblogs.asp.net/dwahlin/archive/2007/09/09/c-3-0-features-object-initializers.aspx –

0

Không, nó không bỏ kết nối. Tôi tin rằng nó không nên. Bạn có thể muốn sử dụng nó ở nơi khác.

1

Theo như tôi biết thì không. Tôi sử dụng lồng nhau Sử dụng câu lệnh để đạt được điều này, tạo kết nối đầu tiên, sau đó tạo bộ điều hợp và như sử dụng câu lệnh "pop", bộ điều hợp được Xử lý, sau đó kết nối được Xử lý, trong đó làm kích hoạt đóng:

Using conn as New SqlConnection("") 
    Using adapter as New SqlDataAdapter() With {.Connection = conn} 
     'Do stuff' 
    End Using 
End Using 

Cú pháp này hầu như giống hệt với C#, nếu đó là ngôn ngữ bạn chọn.