2011-01-06 81 views
12

當具有相同的查詢,但不同的參數查詢數據庫,是它更好地:多次執行相同的SQL查詢時重用SqlCommand會更好嗎?

  • 做一個單一的使用,
  • 或創建兩個單獨的查詢?使用單一的

實施例:

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."); 
} 

使用兩個單獨的查詢相同的代碼的示例:

// 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."); 
} 

在我看來,第二個必須是優選,因爲:

  • 它可以更清楚地看到SQL命令的處理位置以及執行次數,它可以更容易地修改,如果將來由於某種原因必須在一種情況下修改查詢,但是不在其他,
  • 第一個可以很容易忘記SqlCommand.Parameters.Clear()

另一方面,第一個示例更明確地表明查詢在兩種情況下都是相同的,並且只有參數更改。

+2

你說得對,第二個解決方案更乾淨。除非您打算進行超級性能調優,否則不應該重複使用相同的SqlCommand。 – Davita 2011-01-06 23:56:40

+2

也許你應該把插入代碼放到一個單獨的函數中並調用它兩次。 – 2011-01-07 00:00:19

回答

15

有很少的好處重用的命令情況下,除非你打算叫Prepare

如果你要運行命令多次(幾十個或更多),那麼你可能要創建的命令,準備它,在一個循環中執行它,然後它丟棄。如果您多次運行該命令,性能提升非常顯着。 (但是,在準備之前,您可以添加一次參數 - 不是每次像在第一個代碼示例中那樣刪除並重新添加它們,您應該每次更改參數,而不是創建新的參數。)

如果你只打算運行命令的時間屈指可數,性能是不是一個問題,你應該用你喜歡的任何風格去。每次創建命令都有一個好處,它很容易被提取到一個方法中,所以你不會重複自己。

0

如果「更好」你的意思是「更清晰」或「清潔劑」,使用單獨的SqlCommand對象。這也有助於重構代碼。

如果「更好」你的意思是「更快」,重新使用的SqlCommand將消除一個新的SqlConnection將創建(相對於從連接池中被拉出)的機會。

相關問題