2008-09-13 37 views
48

Tôi có thể sử dụng phương pháp này một cách hiệu quả không?SqlCommand.Dispose có đóng kết nối không?

using(SqlCommand cmd = new SqlCommand("GetSomething", new SqlConnection(Config.ConnectionString)) 
{ 
    cmd.Connection.Open(); 
    // set up parameters and CommandType to StoredProcedure etc. etc. 
    cmd.ExecuteNonQuery(); 
} 

mối quan tâm của tôi là: phương thức Dispose của SqlCommand (được gọi khi thoát khỏi khối sử dụng) sẽ đóng đối tượng SqlConnection cơ bản hay không?

+0

Sau khi xử lý SqlCommand com, trường hợp kết nối của nó sẽ không bị hủy bỏ (không được sử dụng bởi bất kỳ thứ gì). Vì vậy, khi GarbageCollector hoàn thành cá thể SqlConnection, sẽ không kết nối được xử lý? Tôi nghĩ rằng nó sẽ được, bởi vì kết nối được tham chiếu bởi chỉ cmd ở đây. – mecek

+0

Cũng trong trường hợp đó, @ Mecek, bộ nhớ sẽ được giải phóng khó hơn vì nó sẽ đi qua quyết toán mà sẽ thúc đẩy nó từ gen0 đến gen1, tôi đoán vậy. –

Trả lời

97

Không, việc hủy bỏ SqlCommand sẽ không ảnh hưởng đến Kết nối. Một cách tiếp cận tốt hơn sẽ còn quấn SqlConnection trong một khối sử dụng cũng như:

using (SqlConnection conn = new SqlConnection(connstring)) 
{ 
    conn.Open(); 
    using (SqlCommand cmd = new SqlCommand(cmdstring, conn)) 
    { 
     cmd.ExecuteNonQuery(); 
    } 
} 

Nếu không, kết nối là không thay đổi bởi thực tế là một chỉ huy đã được sử dụng nó đã được xử lý (có lẽ đó là những gì bạn muốn?). Nhưng hãy nhớ, rằng một kết nối nên được xử lý là tốt, và có khả năng quan trọng hơn để xử lý hơn một lệnh.

EDIT:

tôi chỉ thử nghiệm này:

SqlConnection conn = new SqlConnection(connstring); 
conn.Open(); 

using (SqlCommand cmd = new SqlCommand("select field from table where fieldid = 1", conn)) 
{ 
    Console.WriteLine(cmd.ExecuteScalar().ToString()); 
} 

using (SqlCommand cmd = new SqlCommand("select field from table where fieldid = 2", conn)) 
{ 
    Console.WriteLine(cmd.ExecuteScalar().ToString()); 
} 

conn.Dispose(); 

Lệnh đầu tiên được xử lý khi khối sử dụng được kết thúc. Kết nối vẫn mở và tốt cho lệnh thứ hai.

Vì vậy, việc vứt bỏ lệnh chắc chắn sẽ không loại bỏ kết nối đang sử dụng.

+0

Bạn không cần mở kết nối trước khi tạo lệnh phải không? Làm cho nó sạch hơn một chút như thế này: sử dụng (SqlConnection conn = new SqlConnection (connstring)) sử dụng (SqlCommand cmd = new SqlCommand (cmdstring, conn)) { conn.Open(); cmd.ExecuteNonQuery(); conn.Close(); } –

+0

Tôi đoán định dạng không dính ... nhưng về cơ bản gộp các câu lệnh bằng cách sử dụng cùng nhau và loại bỏ mức độ lồng nhau.(Nếu bạn muốn) –

+7

Điểm của ví dụ không phải là để hiển thị một cú pháp đơn giản hơn, nhưng để chứng minh rằng cả hai SqlCommands có thể được sử dụng với cùng một kết nối và sau đó được xử lý mà không cần xử lý kết nối. Kết nối cần phải được mở và sau đó được sử dụng hai lần để chứng minh điều này (xem câu hỏi gốc). –

10

SqlCommand.Dispose sẽ không đủ vì nhiều SqlCommand (s) có thể (lại) sử dụng cùng một SqlConnection. Tập trung vào SqlConnection.

-10

Tôi sử dụng mẫu này. Tôi có phương pháp tin này ở đâu đó trong ứng dụng của tôi:

private void DisposeCommand(SqlCommand cmd) 
{ 
    try 
    { 
     if (cmd != null) 
     { 
      if (cmd.Connection != null) 
      { 
       cmd.Connection.Close(); 
       cmd.Connection.Dispose(); 
      } 
      cmd.Dispose(); 
     } 
    } 
    catch { } //don't blow up 
} 

Sau đó, tôi luôn luôn tạo ra các lệnh SQL và các kết nối trong một khối try (nhưng mà không bị bao bọc trong một khối sử dụng) và luôn luôn có một khối finally như:

finally 
    { 
     DisposeCommand(cmd); 
    } 

Đối tượng kết nối là thuộc tính của đối tượng lệnh làm cho khối sử dụng vụng về trong trường hợp này - nhưng mẫu này hoàn thành công việc mà không làm lộn xộn mã của bạn.

+0

điều này giả định rằng bạn chỉ sử dụng kết nối của bạn một lần cho lệnh duy nhất đó, và do đó bạn sẽ phải tạo một kết nối mới và mở nó, mỗi khi bạn cần thực hiện một lệnh mới. Có rất nhiều chi phí trong việc tạo và mở các kết nối. –

+8

Trong mắt tôi, đây là mã xấu, và sẽ sạch hơn nhiều khi chỉ sử dụng câu lệnh 'using' để tự động xử lý lệnh. – KristianB

+2

Downvoting - phương pháp 'sử dụng' không cần thiết và kém hiệu quả. – NickG

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