2011-12-23 22 views
5

Dưới đây là một phiên bản đơn giản của ví dụ của tôi:.Net: Kết nối của tôi có bị đóng qua Dispose trong ví dụ này không?

using (DbCommand cmd = new SqlCommand("myProcedure", (SqlConnection)DataAccessHelper.CreateDatabase().CreateConnection()) { CommandType = CommandType.StoredProcedure }) 
{ 
    cmd.Connection.Open(); 
    using(IDataReader dr = cmd.ExecuteReader()) 
     doWork(dr); 
} 

Khi lệnh được xử lý, được kết nối đóng cửa? Hoặc tôi sẽ cần phải có tuyên bố sử dụng đầu tiên được cho kết nối, và sau đó tạo ra các lệnh trong đóng cửa?

Trả lời

11

Nếu bạn muốn người đọc để đóng kết nối, bạn có thể sử dụng sự quá tải của ExecuteReader():

... 
using (IDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection)) 
... 

Theo mặc định, xử lý một độc giả không phát hành các kết nối. - see MSDN for more info...

Để giải quyết vấn đề Close() vs Dispose(), MSDN khẳng định:

Nếu DbConnection đi ra khỏi phạm vi, nó không phải là đóng cửa. Do đó, bạn phải đóng kết nối rõ ràng bằng cách gọi Đóng hoặc Vứt bỏ, có chức năng tương đương.

Do đó, kết nối tự đóng không cần phải được xử lý nhất thiết. Sự khác biệt chính là kết nối đã đóng có thể được mở lại, nhưng không thể kết nối được xử lý. Công việc bổ sung chính mà Dispose() thực hiện là đặt nội bộ là null, điều này sẽ không có nhiều ảnh hưởng vì kết nối vẫn bị ngắt khỏi phạm vi.

+0

Tôi không tin rằng việc hủy bỏ kết nối, chỉ cần đóng kết nối. –

+0

Thao tác này có hủy kết nối không? –

+0

Từ MSDN, gọi Close() và Dispose() trên một kết nối có chức năng tương đương: –

4

Tác phẩm của James Michael Hare, nhưng bạn cũng sẽ muốn vứt bỏ kết nối của mình. Hãy thử điều này:

using (SqlConnection conn = (SqlConnection)DataAccessHelper.CreateDatabase().CreateConnection()) 
using (DbCommand cmd = new SqlCommand("myProcedure", conn) { CommandType = CommandType.StoredProcedure }) 
{ 
    cmd.Connection.Open(); 
    using(IDataReader dr = cmd.ExecuteReader()) 
     doWork(dr); 
} 
3

Bạn nên sử dụng một

using(var connection = (SqlConnection)DataAccessHelper.CreateDatabase().CreateConnection()) 
{ 
connection.Open(); 
.... 
} 

Bởi vì ngay cả khi bạn đóng kết nối, bạn vẫn cần phải vứt bỏ nó. Lưu ý rằng SQLConnection không gọi số Close trong số Dispose. Vấn đề là nếu bạn phải tự gọi số Close, bạn phải đặt nó vào một số try...catch để nó được đảm bảo và bạn sẽ không bị rò rỉ bộ nhớ. Có các loại khác trong khung không gọi Close trong số Dispose, theo ý kiến ​​của tôi nên được bao bọc.

+0

Hai lót "sử dụng" thể hiện trong câu trả lời của tôi hoạt động tuyệt vời trong trường hợp này. –

+0

@MikeC. Có, tôi chỉ muốn rant về việc triển khai 'Dispose' khác nhau. –

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