2011-01-06 10 views
12

Kiedy przeglądając bazę danych z tego samego zapytania, ale z różnymi parametrami jest lepiej:Czy lepiej jest ponownie użyć polecenia SqlCommand podczas wykonywania tego samego zapytania SQL kilka razy?

  • zrobić to w jednym użyciu,
  • lub utworzyć dwa oddzielne zapytania?

Przykład jedno z:

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

Przykład ten sam kod za pomocą dwóch oddzielnych zapytania:

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

moim zdaniem, druga musi być korzystne , ponieważ:

  • powoduje, że lepiej jest zobaczyć, gdzie polecenie SQL jest usuwane i ile razy jest ono wykonywane, jest łatwiejsze do zmodyfikowania, jeśli w przyszłości z jakiegoś powodu zapytanie musi zostać zmodyfikowane w jednym przypadku, ale nie w drugim,
  • pierwszy łatwo zapomnieć o SqlCommand.Parameters.Clear().

Z drugiej strony pierwsza próbka jest bardziej jednoznaczna na temat tego, że zapytanie jest takie samo w obu przypadkach i że zmieniają się tylko parametry.

+2

Masz rację, drugie rozwiązanie jest bardziej czyste. Nie powinieneś ponownie używać tej samej SqlCommand, chyba że zamierzasz dokonać hiper-mega tuningu wydajności. – Davita

+2

Może powinieneś umieścić kod wstawiania w oddzielnej funkcji i wywołać go dwa razy. –

Odpowiedz

15

Jest bardzo mało korzyści z ponownego użycia instancji polecenia, chyba że masz zamiar zadzwonić pod numer Prepare.

Jeśli zamierzasz wielokrotnie wykonywać polecenie (kilkadziesiąt lub więcej), prawdopodobnie chcesz utworzyć polecenie, przygotować je, wykonać w pętli, a następnie wyrzucić. Wzrost wydajności jest znaczny, jeśli wielokrotnie uruchamiasz tę komendę. (Możesz jednak dodać parametry przed przygotowaniem - nie usuwaj ich i nie dodawaj ponownie za każdym razem, tak jak robisz to w pierwszym próbce kodu. Za każdym razem należy zmieniać parametry "wartości, nie twórz nowych parametry.)

Jeśli masz zamiar uruchamiać polecenie tylko kilka razy, wydajność nie jest problemem i powinieneś wybrać dowolny styl. Stworzenie polecenia za każdym razem ma tę zaletę, że łatwo jest go wyodrębnić do metody, aby się nie powtórzyło.

0

Jeśli przez "lepsze" masz na myśli "wyraźniejszy" lub "czystszy", użyj oddzielnych obiektów SqlCommand. Pomoże to również w refaktoryzacji kodu w dół drogi.

Jeśli przez "lepsze" masz na myśli "szybsze", ponowne użycie SqlCommand wyeliminuje szansę na utworzenie nowego SqlConnection (w porównaniu do pobierania z puli połączeń).

+1

Oba wywołania konstruktorów w jego drugim przykładzie używają już otwartego połączenia. – sisve

Powiązane problemy