2009-03-30 28 views
9

Nói rằng tôi có hai đối tượng sau đây:Làm thế nào để đóng một OracleConnection trong .NET

OracleConnection connection = new OracleConnection(connectionString); 
OracleCommand command = new OracleCommand(sql, connection); 

Để đóng kết nối hoặc Oracle, tôi phải gọi command.Dispose(), connection.Dispose(), hoặc cả hai?

Đây có phải là đủ tốt:

using(connection) 
{ 
    OracleDataReader reader = cmd.ExecuteReader(); 
    // whatever... 
} 

Trả lời

3

này là đủ tốt. sử dụng câu lệnh sẽ bọc câu lệnh vứt bỏ, vì vậy ngay cả khi ngoại lệ được ném ra, bạn vẫn an toàn, đó là cách ưa thích của tôi để vứt bỏ tài nguyên.

using(OracleConnection connection = new OracleConnection(connectionString); ) 
{ 
    //Create a command object 
    using(OracleCommand command = new OracleCommand(sql, connection)) 
    { 
     using(OracleDataReader reader = cmd.ExecuteReader()) 
     { 
     } 

    } 
    // whatever... 
} 

Tôi nghĩ bằng cách sử dụng "sử dụng", bạn yêu cầu trình biên dịch thử ... cuối cùng chặn và cuối cùng chặn nó sẽ đóng đối tượng dùng một lần cho bạn.

16
using (OracleConnection connection = new OracleConnection(connectionString)) 
{ 
    using (OracleCommand command = new OracleCommand(sql, connection)) 
    { 
     using (OracleDataReader reader = cmd.ExecuteReader()) 
     { 
     } 
    } 
} 

Nếu nó thực hiện IDisposable, và nếu bạn tạo, sau đó đặt nó vào khối sử dụng.

+0

Có phải usings bên trong thực sự cần thiết, hoặc là một cho 'kết nối' đủ tốt? –

+0

Bạn cần phải vứt bỏ tất cả các đối tượng IDisposable của bạn, do đó, mỗi sử dụng là cần thiết. Nếu bạn không, bạn sẽ chỉ vứt bỏ kết nối, và những đứa trẻ sẽ bị bỏ lại. – Russ

+0

Cấp cho các kết nối cơ sở dữ liệu (và cho IDiposable nói chung), nhưng nó sẽ không làm với các luồng đầu vào/đầu ra tầng nơi xử lý cha mẹ phân phối con. – Mac

3

using sẽ đảm bảo kết nối của bạn bị đóng. Bạn cũng có thể vượt qua trong CommandBehavior.CloseConnection để chỉ huy phương thức ExecuteReader của lệnh của bạn để đóng trước khi gọi Dispose.

5

Cả hai câu trả lời đều có khá nhiều mục tiêu. Bạn luôn muốn gọi .Dispose() trên bất kỳ đối tượng IDisposeable nào. Bằng cách gói trong một "sử dụng" bạn cao trình biên dịch để luôn luôn impliment một thử/finialy khối cho bạn.

1 điểm lưu ý, nếu bạn muốn tránh làm tổ, bạn có thể viết mã tương tự như thế này:

using (OracleConnection connection = new OracleConnection(connectionString)) 
using (OracleCommand command = new OracleCommand(sql, connection)) 
using (OracleDataReader reader = cmd.ExecuteReader()) 
    { 
     // do something here 
    } 
+3

bạn * có thể * viết mã như thế, nhưng IMHO bạn nên ** không bao giờ ** viết nó như thế. –

+1

Bạn có thể cung cấp chi tiết cụ thể tại sao không? Tôi làm việc một mình rất nhiều, (không phải bởi sự lựa chọn), vì vậy tôi luôn tìm kiếm những phản hồi từ bên ngoài. – Russ

+1

Đồng ý. Thoạt nhìn ai đó sẽ hiểu đối tượng nào được đóng gói trong một đối tượng khác. Sử dụng nhiều dấu ngoặc đơn và thụt đầu dòng hơn. – wonea

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