2012-02-06 27 views
21

Básicamente Commands tiene Parameters y parámetros tiene funciones como Add, AddWithValue y etc. En todos los tutoriales que he visto, me di cuenta de que por lo general están utilizando en lugar de AddAddWithValue.Diferencia con Parameters.Add y Parameters.AddWithValue

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

vs

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

¿Hay una razón para no usar AddWithValue? Preferiría usar eso sobre

Parameters.Add("@ID", SqlDbType.Int, 4).Value = 1 

, ya que ahorra mi tiempo de codificación. Entonces, ¿cuál es mejor usar? ¿Cuál es seguro de usar? ¿Mejora el rendimiento?

+1

Eche un vistazo a esta pregunta ASÍ, esto parece lo mismo: http://stackoverflow.com/questions/5445663/difference-between-adding-parameters-to-stored-procedure-in-sql-server- 2005 – CCBlackburn

+1

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

Respuesta

24

Con el método Add() puede restringir la entrada del usuario especificando el tipo y la longitud de los datos, especialmente para las columnas varchar .

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

En caso de AddWithValue() (conversión implícita valor de) método, se envía el valor nvarchar a la base de datos.

+1

Tenga en cuenta que hay una sobrecarga en .Add eso permite agregar un SqlParameter/OleDbParameter/DbParameter. Cuando * omite * el nombre del parámetro (estableciéndolo en NULL) en la instancia del parámetro obtendrá un desagradable rendimiento: el framework .Net creará nombres para usted 'Parameter1..x'. Ahora esto parece una tontería para un SqlParameter, querrás unir la @variable. Sin embargo, con OleDbParameter ... –

2

Usaría AddWithValue para casos normales. Y use Add (name, dbtype ... solo cuando su tipo de columna sea diferente de cómo .net convierte el tipo CLR.

8

creo que también hay algunas desventajas de usar AddWithValue que afectan el plan Excection caché SQL, vea la sección de longitud de parámetro here

+0

Teniendo en cuenta esta horrible oración en el artículo vinculado: "Al no especificar la longitud cuando usa ParameterCollection.AddWithValue, puede tener tantas consultas diferentes en la memoria caché del plan, ya que tiene diferentes longitudes de cadena. " esto puede ser la respuesta más valiosa aquí :) –

+0

ese artículo es bastante viejo, ¿ese es todavía el comportamiento? – Maslow

Cuestiones relacionadas