Лучше ли повторно использовать 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. Это также поможет с рефакторингом вашего кода по дороге.

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