Подтвердить что ты не робот

Лучше ли повторно использовать 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().

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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