Лучше ли повторно использовать SqlCommand при выполнении одного и того же SQL-запроса несколько раз? - PullRequest
13 голосов
/ 07 января 2011

При запросе к базе данных с тем же запросом, но разными параметрами, лучше:

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

Пример однократного использования:

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 ]

17 голосов
/ 07 января 2011

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

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

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

0 голосов
/ 07 января 2011

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

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

...