2012-02-06 8 views
21

Zasadniczo Commands ma Parameters i parametry ma funkcje jak Add, AddWithValue i itd. We wszystkich tutoriali Widziałem, zwykle zauważyć, że są one za pomocą Add zamiast AddWithValue.Różnica z Parameters.Add i Parameters.AddWithValue

.Parameters.Add("@ID", SqlDbType.Int) 

vs

.Parameters.AddWithValue("@ID", 1) 

Czy istnieje powód, aby NIE używać AddWithValue? Wolałbym używać tego ponad

ponieważ zapisuje mój czas kodowania. Więc co jest lepsze w użyciu? Które jest bezpieczne w użyciu? Czy poprawia wydajność?

+1

Spójrz na to pytanie SO, wygląda to tak samo: http://stackoverflow.com/questions/5445663/difference-between-adding-parameters-to-stored-procedure-in-sql-server- 2005 – CCBlackburn

+1

Czytać o: http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/ – RemarkLima

Odpowiedz

24

Metodą Add() możesz ograniczyć wprowadzanie danych przez użytkownika, określając rodzaj i długość danych - szczególnie dla kolumn varchar .

.Parameters.Add("@name",SqlDbType.VarChar,30).Value=varName; 

w przypadku AddWithValue() (niejawna konwersja wartości) metody, wysyła wartość nvarchar do bazy danych.

+1

Należy pamiętać, że istnieje przeciążenie na .Add to dodajmy parametr SqlParameter/OleDbParameter/DbParameter. Gdy * pominiesz * nazwę parametru (ustawiając ją na NULL) w instancji parametru, dostaniesz nieprzyjemne trafienie wydajnościowe: struktura .Net utworzy dla ciebie nazwy "Parameter1..x". Teraz wydaje się to głupie dla SqlParameter, chcesz dopasować do @variable. Jednak przy użyciu OleDbParameter ... –

2

Używam AddWithValue dla normalnych przypadków. I użyj Add (nazwa, dbtype ... tylko wtedy, gdy typ twojej kolumny różni się od tego, jak .net konwertuje typ CLR.)

8

wierzę, że istnieją również pewne minusy do korzystania AddWithValue wpływające SQL Cache plan Excection, patrz sekcja długości parametru here

+0

Biorąc pod uwagę to przerażające zdanie w połączonym artykule: "Nie określając długości podczas korzystania z parametru ParameterCollection.AddWithValue, można mieć tyle różnych zapytań w pamięci podręcznej planów, ponieważ mają one różne długości ciągów. " to może być najbardziej wartościowa odpowiedź tutaj :) –

+0

ten artykuł jest dość stary, czy to nadal zachowanie? – Maslow