2011-01-06 1 views
12

При запросе данных с тем же запросом, но разными параметрами, что лучше:Лучше ли повторно использовать SqlCommand при выполнении одного и того же запроса SQL несколько раз?

  • сделать это в одном использовании,
  • или создать два отдельных запросов?

Пример один с помощью:

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

+2

Возможно, вы должны поместить код вставки в отдельную функцию и вызвать его дважды. –

ответ

15

Существует очень мало пользы для повторного использования экземпляра команды, если вы не планируете звонить Prepare.

Если вы собираетесь выполнять команду много раз (десятки или более), то вы, вероятно, захотите создать команду, подготовить ее, выполнить ее в цикле и затем утилизировать. Увеличение производительности является значительным, если вы используете команду много раз. (Однако вы должны добавить параметры один раз, прежде чем готовиться - не удалять и повторно добавлять их каждый раз, как вы делаете в первом примере кода. Вы должны каждый раз изменять параметры значения, а не создавать новые параметры.)

Если вы только собираетесь выполнять команду несколько раз, производительность не является проблемой, и вы должны пойти в зависимости от того, какой стиль вы предпочитаете. Создание команды каждый раз имеет преимущество, которое легко извлечь в метод, чтобы вы не повторялись.

0

Если «лучше» означает «более четкое» или «очиститель», используйте отдельные объекты SqlCommand. Это также поможет вам реорганизовать ваш код в будущем.

Если «лучше» вы имеете в виду «быстрее», повторное использование SqlCommand устранит вероятность того, что будет создано новое SqlConnection (по сравнению с удалением из пула соединений).

+1

Оба вызова конструктора во втором примере используют уже открытое соединение. – sisve