2012-04-03 19 views
45

He leído la documentación y ejemplos de MSDN here y sé que la sintaxis correcta para una llamada Paramters.Add es:Diferencia entre Parameters.Add y Parameters.AddWithValue

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

donde usted tiene que 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); 

sola línea y omitir 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 consigo ningún error de compilación y aún más raro, todo parece funcionar correctamente cuando se ejecuta el código?

Respuesta

70

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 en desuso la antigua en favor de AddWithValue es agregar mayor claridad, así como debido a que el segundo parámetro es object, lo que hace que no sea inmediatamente obvio para algunas personas qué sobrecarga de Add se estaba llamando, y dieron como resultado un comportamiento muy diferente.

Tome un vistazo a este ejemplo:

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

A primera vista, parece que está llamando a la sobrecarga de Add(string name, object value), pero no es. ¡Llama a la sobrecarga Add(string name, SqlDbType type)! Esto se debe a que 0 es implícitamente convertible a tipos enum. Por lo que estas dos líneas:

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

y

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

En realidad resultan en dos métodos diferentes que se llaman. 1 no es convertible a una enumeración implícitamente, por lo que elige la sobrecarga object. Con 0, elige la sobrecarga de la enumeración.

+0

La única cosa es que usted tiene que vivir con una nueva advertencia para cada parámetro se agrega esta manera. – phadaphunk

+4

Sí, la advertencia es porque ** esta sobrecarga está obsoleta ** como se indica en la documentación. También de la documentación, "Tenga cuidado cuando use esta sobrecarga del método SqlParameterCollection.Add para especificar valores de parámetros enteros". –

+0

En caso de que alguien que es curioso como yo, se pregunte por qué cero puede convertir implícitamente a una enumeración, pero no a ningún otro entero. Aquí hay un enlace a una explicación SO, http://stackoverflow.com/questions/14950750/why-switch-for-enum-accepts-implicit-conversion-to-0-but-no-for-any-other-intege –

3

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.

El inconveniente 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 tema tan aquí: http://forums.asp.net/t/1200255.aspx/1

8

La diferencia es la conversión implícita cuando se utiliza 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 tipo complejo (por ejemplo, DateTime, float), probablemente usaré Add porque es más explícito pero AddWithValue para escenarios de tipo más directos (Int to Int).

1

cuando usamos CommandObj.Parameter.Add() se tarda 2 parámetro primero es parámetro de procedimiento y segunda es su tipo de datos, pero .AddWithValue() tomar 2 parámetro primero es parámetro de procedimiento y segunda 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 de procedimiento almacenado que tipo de datos es Int

0

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 add requiere que primero especifique el tipo de Base de datos. Esto ayuda a reducir tales errores.

Para más detalles Please click here