2012-04-03 4 views
45

Czytałem dokumentację i przykłady MSDN here i wiem, że poprawna składnia dla Paramters.Add zaproszenia jest:Różnica między Parameters.Add i Parameters.AddWithValue

command.Parameters.Add("@ID", SqlDbType.Int); 
    command.Parameters["@ID"].Value = customerID; 

gdzie trzeba podać nazwę parametru, SqlDbType ORAZ wartość z .Value.

Teraz poprawna składnia dla Parameters.AddWithValue zaproszenia jest:

command.Parameters.AddWithValue("@demographics", demoXml); 

Pojedyncza linia i pominąć Type część.

Moje pytanie brzmi: Jak to jest, że kiedy robię to tak,

command.Parameters.Add("@demographics", demoXml); 
    // .Add method with .AddWithValue syntax 

nie dostanę żadnej kompilacji błąd i jeszcze dziwniejsze, wszystko wydaje się działać poprawnie, gdy kod jest wykonywany?

Odpowiedz

70

Nie ma różnicy w zakresie funkcjonalności. W rzeczywistości, zarówno to zrobić:

return this.Add(new SqlParameter(parameterName, value)); 

Powodem są przestarzałe starą na rzecz AddWithValue jest dodanie dodatkowej wyrazistości, a także dlatego, że drugi parametr jest object, co sprawia, że ​​nie od razu oczywiste dla niektórych ludzi które wywołało przeciążenie Add i zaowocowały bardzo odmiennym zachowaniem.

Spójrz na ten przykład:

SqlCommand command = new SqlCommand(); 
command.Parameters.Add("@name", 0); 

Na pierwszy rzut oka wygląda na to, że dzwoni przeciążenie Add(string name, object value), ale nie jest. Nazywa się przeciążenie Add(string name, SqlDbType type)! Dzieje się tak dlatego, że 0 jest niejawnie wymienialne na typy wyliczeniowe. Tak więc te dwie linie:

command.Parameters.Add("@name", 0); 

i

command.Parameters.Add("@name", 1); 

Właściwie spowodować dwie różne metody miano. 1 nie można jawnie wymieniać na wyliczenie, więc wybiera przeciążenie object. Z 0, wybiera przeciążenie enum.

+0

Jedyną rzeczą jest to, będziesz musiał żyć z nowym ostrzeżeniem dla każdego parametru dodać ten sposób. – phadaphunk

+4

Tak, ostrzeżenie jest takie, ponieważ ** to przeciążenie jest przestarzałe **, jak zaznaczono w dokumentacji. Również z dokumentacji "Należy zachować ostrożność, gdy używasz tego przeciążenia metody SqlParameterCollection.Add, aby określić wartości parametrów całkowitych." –

+0

W przypadku kogoś, kto jest ciekawy jak ja, zastanawia się, dlaczego zero może niejawnie konwertować do wyliczenia, ale nie do żadnej innej liczby całkowitej. Oto link do wyjaśnienia SO, http://stackoverflow.com/questions/14950750/why-switch-for-enum-accepts-implicit-conversion-to-0- but-no- for-any-other-intege –

3

Bez jawnego podania typu, jak w command.Parameters.Add("@ID", SqlDbType.Int);, będzie próbował niejawnie przekształcić dane wejściowe na oczekiwane.

Wadą tego jest to, że niejawna konwersja może nie być najbardziej optymalną z konwersji i może spowodować spadek wydajności.

Jest dyskusja o tym samym temacie tutaj: http://forums.asp.net/t/1200255.aspx/1

8

Różnica jest niejawna konwersja przy użyciu AddWithValue. Jeśli wiesz, że twoje wykonywanie zapytania SQL (procedura przechowywana) przyjmuje wartość typu int, nvarchar, etc, nie ma powodu, aby ponownie zgłaszać je w swoim kodzie.

Dla scenariuszy złożonych (na przykład DateTime, float), prawdopodobnie użyję Adda, ponieważ jest bardziej wyraźny, ale AddWithValue dla bardziej prostych scenariuszy typu (Int do Int).

1

gdy używamy CommandObj.Parameter.Add() wymagać 2 jest parametr pierwszy parametr i drugi tryb jest jego rodzaj danych, ale .AddWithValue() ma dwa parametr pierwszy parametr jest procedura i drugi zmienne dane

CommandObj.Parameter.Add("@ID",SqlDbType.Int).Value=textBox1.Text; 

// dla .AddWithValue

CommandObj.Parameter.AddWitheValue("@ID",textBox1.Text); 

gdzie ID jest parametrem procedury składowanej, jaki typ danych jest Int

0

nie ma różnicy pod względem funkcjonalności


Sposób addwithvalue przyjmuje obiekt jako wartość. Nie ma sprawdzania typu danych typu. Potencjalnie może to prowadzić do błędu, jeśli typ danych nie pasuje do tabeli SQL. Metoda add wymaga najpierw określenia typu bazy danych. Pomaga to zmniejszyć takie błędy.

Więcej szczegółów Please click here