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.
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
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. –