2011-01-06 5 views
12

Khi truy vấn cơ sở dữ liệu với cùng một truy vấn nhưng các thông số khác nhau, nó là tốt hơn để:Có tốt hơn khi tái sử dụng SqlCommand khi thực thi cùng một truy vấn SQL nhiều lần không?

  • làm điều đó trong một đơn sử dụng,
  • hoặc để tạo ra hai truy vấn riêng biệt?

Ví dụ về một đơn sử dụng:

using (SqlCommand addProduct = new SqlCommand(@"insert into [Products].[Products] ([Name], [Price]) values (@name, @price)", sqlConnection)) 
{ 
    // Insert the first product. 
    addProduct.Parameters.AddWithValue("@name", "Product 1"); 
    addProduct.Parameters.AddWithValue("@price", 41F); 
    int countAffectedRows = addProduct.ExecuteNonQuery(); 
    Debug.Assert(countAffectedRows == 1, "Wrong number of rows affected."); 

    addProduct.Parameters.Clear(); 

    // Insert the second product. 
    addProduct.Parameters.AddWithValue("@name", "Product 2"); 
    addProduct.Parameters.AddWithValue("@price", 49.9); 
    countAffectedRows = addProduct.ExecuteNonQuery(); 
    Debug.Assert(countAffectedRows == 1, "Wrong number of rows affected."); 
} 

Ví dụ về mã tương tự sử dụng hai truy vấn riêng biệt:

// Insert the first product. 
using (SqlCommand addProduct = new SqlCommand(@"insert into [Products].[Products] ([Name], [Price]) values (@name, @price)", sqlConnection)) 
{ 
    addProduct.Parameters.AddWithValue("@name", "Product 1"); 
    addProduct.Parameters.AddWithValue("@price", 41F); 
    int countAffectedRows = addProduct.ExecuteNonQuery(); 
    Debug.Assert(countAffectedRows == 1, "Wrong number of rows affected."); 
} 

// Insert the second product. 
using (SqlCommand addProduct = new SqlCommand(@"insert into [Products].[Products] ([Name], [Price]) values (@name, @price)", sqlConnection)) 
{ 
    addProduct.Parameters.AddWithValue("@name", "Product 2"); 
    addProduct.Parameters.AddWithValue("@price", 49.9); 
    int countAffectedRows = addProduct.ExecuteNonQuery(); 
    Debug.Assert(countAffectedRows == 1, "Wrong number of rows affected."); 
} 

Theo tôi, điều thứ hai phải được ưa thích , bởi vì:

  • nó làm cho nó rõ ràng hơn để xem nơi các lệnh SQL được xử lý và bao nhiêu lần nó được thực hiện,
  • nó dễ dàng hơn để sửa đổi nếu, trong tương lai, vì một số lý do, truy vấn phải được sửa đổi trong một trường hợp, nhưng không phải trong trường hợp khác,
  • cách đầu tiên giúp bạn dễ dàng quên số SqlCommand.Parameters.Clear().

Mặt khác, mẫu đầu tiên rõ ràng hơn về thực tế là truy vấn giống nhau trong cả hai trường hợp và chỉ có các tham số thay đổi.

+2

Bạn nói đúng, giải pháp thứ hai sạch sẽ hơn. Bạn không nên tái sử dụng cùng một SqlCommand trừ khi bạn đang đi để làm một điều chỉnh hiệu suất siêu lớn. – Davita

+2

Có lẽ bạn nên đặt mã chèn vào một chức năng riêng biệt và gọi nó hai lần. –

Trả lời

15

Có rất ít lợi ích khi sử dụng lại cá thể lệnh, trừ khi bạn dự định gọi Prepare.

Nếu bạn định chạy lệnh nhiều lần (hàng chục hoặc nhiều hơn), thì bạn có thể muốn tạo lệnh, chuẩn bị, thực thi nó trong một vòng lặp, và sau đó vứt bỏ nó. Hiệu suất đạt được là đáng kể nếu bạn đang chạy lệnh nhiều lần. (Bạn sẽ thêm các tham số một lần, tuy nhiên, trước khi bạn chuẩn bị - không xóa và thêm lại chúng mỗi lần như bạn đang làm trong mẫu mã đầu tiên của mình. Bạn nên thay đổi các tham số 'giá trị mỗi lần, không tạo mới tham số.)

Nếu bạn chỉ định chạy lệnh một vài lần, hiệu suất không phải là vấn đề và bạn nên chọn kiểu nào bạn thích. Tạo lệnh mỗi lần có lợi ích là nó dễ dàng để giải nén vào một phương pháp, do đó bạn không lặp lại chính mình.

0

Nếu bằng "tốt hơn", bạn có nghĩa là "rõ ràng hơn" hoặc "sạch hơn", hãy sử dụng các đối tượng SqlCommand riêng biệt. Điều này cũng sẽ hỗ trợ việc tái cấu trúc mã của bạn trên đường.

Nếu bằng "tốt hơn", bạn có nghĩa là "nhanh hơn", sử dụng lại SqlCommand sẽ loại bỏ cơ hội SqlConnection mới sẽ được tạo (so với được kéo từ nhóm kết nối).

+1

Cả hai lệnh gọi hàm tạo trong ví dụ thứ hai của bạn đều sử dụng kết nối đã được mở. – sisve