c# - stored - Diferencia entre Parameters.Add y Parameters.AddWithValue
procedure sql server c# (5)
here leo la documentación de MSDN y ejemplos here y sé que la sintaxis correcta para una llamada Paramters.Add
es:
command.Parameters.Add("@ID", SqlDbType.Int);
command.Parameters["@ID"].Value = customerID;
Donde debe especificar el Nombre del parámetro, el SqlDbType
Y el Valor con .Value
.
Ahora la sintaxis correcta para una llamada Parameters.AddWithValue
es:
command.Parameters.AddWithValue("@demographics", demoXml);
Una sola línea y omita la parte Type
.
Mi pregunta es: ¿Cómo es que cuando lo hago así,
command.Parameters.Add("@demographics", demoXml);
// .Add method with .AddWithValue syntax
No obtengo ningún error de compilación y, lo que es más extraño, todo parece funcionar correctamente cuando se ejecuta el código.
La diferencia es la conversión implícita cuando se usa AddWithValue. Si sabe que su consulta SQL en ejecución (procedimiento almacenado) está aceptando un valor de tipo int, nvarchar, etc., no hay ninguna razón para volver a declararlo en su código.
Para escenarios de tipos complejos (por ejemplo, DateTime, float), probablemente usaré Add, ya que es más explícito pero AddWithValue para escenarios de tipo más directo (Int to Int).
No hay diferencia en términos de funcionalidad
El método addwithvalue
toma un objeto como el valor. No hay ningún tipo de verificación de tipo de datos. Potencialmente, eso podría generar un error si el tipo de datos no coincide con la tabla SQL. El método de add
requiere que especifique primero el tipo de Base de datos. Esto ayuda a reducir tales errores.
Para más detalles, haga clic aquí
No hay diferencia en términos de funcionalidad. De hecho, ambos hacen esto:
return this.Add(new SqlParameter(parameterName, value));
La razón por la que desaprobaron la anterior a favor de AddWithValue
es para agregar claridad adicional, así como también porque el segundo parámetro es un object
, lo que hace que no sea obvio para algunas personas que se llamó a la sobrecarga de Add
y resultaron en una gran diferencia comportamiento.
Echale un vistazo a éste ejemplo:
SqlCommand command = new SqlCommand();
command.Parameters.Add("@name", 0);
A primera vista, parece que está llamando a la sobrecarga Add(string name, object value)
, pero no lo es . Add(string name, SqlDbType type)
sobrecarga Add(string name, SqlDbType type)
! Esto se debe a que 0 es implícitamente convertible a tipos enum. Entonces estas dos líneas:
command.Parameters.Add("@name", 0);
y
command.Parameters.Add("@name", 1);
En realidad, se llaman dos métodos diferentes. 1
no es convertible en una enumeración implícita, por lo que elige la sobrecarga del object
. Con 0
, elige la sobrecarga enum.
Sin proporcionar explícitamente el tipo como en command.Parameters.Add("@ID", SqlDbType.Int);
, intentará convertir implícitamente la entrada a lo que está esperando.
La desventaja de esto es que la conversión implícita puede no ser la más óptima de las conversiones y puede causar un golpe de rendimiento.
Hay una discusión sobre este mismo tema aquí: http://forums.asp.net/t/1200255.aspx/1
cuando usamos CommandObj.Parameter.Add () toma 2 parámetro primero es parámetro de procedimiento y segundo es su tipo de datos, pero .AddWithValue () toma 2 parámetro primero es parámetro de procedimiento y segundo es la variable de datos
CommandObj.Parameter.Add("@ID",SqlDbType.Int).Value=textBox1.Text;
// para .AddWithValue
CommandObj.Parameter.AddWitheValue("@ID",textBox1.Text);
donde ID es el parámetro del procedimiento almacenado cuyo tipo de datos es Int.