wake-up-neo.com

Unterschied zwischen Parameters.Add und Parameters.AddWithValue

Ich habe die MSDN-Dokumentation und die Beispiele here gelesen und weiß, dass die korrekte Syntax für einen Paramters.Add-Aufruf lautet:

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

Wo Sie den Parameternamen angeben müssen, die SqlDbType UND den Wert mit .Value.

Nun ist die korrekte Syntax für einen Parameters.AddWithValue-Aufruf:

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

Einzelne Zeile und überspringen Sie den Teil Type.

Meine Frage ist: Wie ist es, wenn ich es so mache,

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

Ich bekomme keine Kompilierungsfehler und sogar noch merkwürdiger, scheint alles richtig zu funktionieren, wenn der Code ausgeführt wird?

47
phadaphunk

Bei der Funktionalität gibt es keinen Unterschied. Tatsächlich machen beide das:

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

Der Grund, warum sie den alten zugunsten von AddWithValue ablehnten, ist das Hinzufügen zusätzlicher Klarheit. Außerdem ist der zweite Parameter object, wodurch es einigen Leuten nicht sofort klar wird, welche Überladung von Add aufgerufen wurde Verhalten.

Schauen Sie sich dieses Beispiel an:

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

Auf den ersten Blick sieht es so aus, als würde es die Add(string name, object value)-Überladung aufrufen, aber es ist nicht . Es nennt die Add(string name, SqlDbType type)-Überladung! Dies liegt daran, dass 0 implizit in Enummentypen konvertiert werden kann. Also diese zwei Zeilen:

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

und

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

Tatsächlich werden zwei verschiedene Methoden aufgerufen. Da 1 nicht implizit in eine Enumeration konvertierbar ist, wählt er die object-Überladung aus. Mit 0 wird die Enum-Überladung ausgewählt.

75
vcsjones

Der Unterschied ist die implizite Konvertierung bei der Verwendung von AddWithValue. Wenn Sie wissen, dass Ihre ausgeführte SQL-Abfrage (gespeicherte Prozedur) einen Wert vom Typ int, nvarchar usw. akzeptiert, gibt es keinen Grund, diesen in Ihrem Code erneut zu deklarieren.

Für komplexe Typ-Szenarien (Beispiel wäre DateTime, Float) verwende ich wahrscheinlich Add, da es expliziter ist, aber AddWithValue für einfachere Typ-Szenarien (Int bis Int). 

8
Dennis Rongo

Ohne explizite Angabe des Typs in command.Parameters.Add("@ID", SqlDbType.Int); wird versucht, die Eingabe implizit in das zu konvertieren, was sie erwartet. 

Der Nachteil ist, dass die implizite Konvertierung möglicherweise nicht die optimalste Konvertierung ist und einen Performance-Treffer verursacht. 

Zu diesem Thema gibt es hier eine Diskussion: http://forums.asp.net/t/1200255.aspx/1

3
Khan

wenn wir CommandObj.Parameter.Add () verwenden, ist 2 Parameter der erste Parameterparameter und zweitens der Datentyp, aber .AddWithValue () 2 ist der erste Parameterparameter und der zweite ist die Datenvariable 

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

// für .AddWithValue

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

dabei ist ID der Parameter der gespeicherten Prozedur, deren Datentyp Int ist

Es gibt keinen Unterschied hinsichtlich der Funktionalität


.__ Die addwithvalue-Methode nimmt ein Objekt als Wert. Es gibt keine Typ-Datentypprüfung. Dies kann möglicherweise zu Fehlern führen, wenn der Datentyp nicht mit der SQL-Tabelle übereinstimmt. Für die add-Methode müssen Sie zuerst den Datenbanktyp angeben. Dies hilft, solche Fehler zu reduzieren.

Für mehr Details klicken Sie bitte hier

0
Brijesh Mavani