2012-04-20 9 views
23

En una de nuestra aplicación los parámetros pasados ​​a un procedimiento almacenado de esta manera¿Es necesario agregar un @ delante de un nombre SqlParameter?

Dim parm As New SqlParameter("searchText", SqlDbType.VarChar) 
parm.Direction = ParameterDirection.Input 
parm.Size = 50 
parm.Value="test" 

cmd.Parameters.Add(parm) 

y el procedimiento contiene un parámetro como @searchText

es decir, el nombre del parámetro pasado a partir del código es searchText y que en el el procedimiento almacenado es @searchText.

Pero funciona correctamente, siempre obtengo los resultados requeridos.

Así que mi pregunta es como que no hay necesidad de especificar @ antes del parámetro? Si se anexará @, ¿alguien puede dar una respuesta para esto?

Respuesta

22

Según to the documentation, el nombre debe comenzar con una @:

El ParameterName se especifica en forma @paramname.

De acuerdo con el código fuente (echar un vistazo a SqlCommand y SqlParameter.ParameterNameFixed en la fuente de referencia), se añade un @ automáticamente, si es necesario.

Así que sí, funciona, pero es una función no documentada. La práctica recomendada recomienda que no confíe en esto y prefija manualmente el nombre de su parámetro con un @.

+0

Lo que está diciendo es que agregará automáticamente @ antes del nombre del parámetro. ¿derecho? –

+4

@mahesh: en su implementación actual, por lo que puedo ver, sí. Como es una característica no documentada, puede cambiar en cualquier momento (por ejemplo, en una nueva versión de marco) sin previo aviso. – Heinzi

+0

bien, gracias .. pero me pregunto cómo sucede ... –

2

Ref: SqlParameter.ParameterName Property y IDataParameter.ParameterName Property

El ParameterName se especifica en la forma @paramname. Debe establecer ParameterName antes de ejecutar un SqlCommand que dependa de parámetros. Si está utilizando el servidor Sql como base de datos, debe especificar @ antes de el nombre del parámetro.

nombre del parámetro debe ser el mismo que en el backend, por ejemplo. usted tiene @searchText después en su especificación de parámetros que debe ser SqlParameter("@searchText" ..

el código debe ser así

Dim parm As New SqlParameter("@searchText", SqlDbType.VarChar) 
parm.Direction = ParameterDirection.Input 
parm.Size = 50 
parm.Value="test" 

cmd.Parameters.Add(parm) 

Nota: Oracle y SQLite Uso uso diferente carácter diferente para especificar los parámetros y puede haber símbolo @ no se utiliza especificado por la especificación de ado.net.

Editar: Por los comentarios

Como se ha especificado el link, también es algún tipo de solución, pero de acuerdo con la documentación de MSDN, debe especificar el parámetro posicional con '@' si está usando cualquier proveedor de datos oledb, sql, odbc. Ref

if (0 < parameterName.get_Length() && '@' != parameterName.get_Chars(0)) 
     { 
      parameterName = "@" + parameterName; 
     } 
+0

sí, sé que debería ser @ searchText, pero mi pregunta es si estoy usando el nombre del parámetro searchtext, entonces también estoy obteniendo los resultados correctos. –

+0

Su respuesta dice que el caso es importante en el nombre del parámetro. Es ese realmente el caso? Me parece que no importa si el caso coincide. –

+0

@ Andrew Barber: No es caso pero pasa parámetros sin @ al principio –

0

No es obligatorio especificar el @. Sin embargo, es una mejor práctica.

Es similar en analogía a las cadenas.Ciertamente no hay daño en la definición de cadenas como tal en .NET:

string s; 
//Rest of the code follows; 

Pero de nuevo, es una buena práctica para definir como:

string s = string.Empty; 

Usted ve, es una cuestión de convenciones y mejor practicas !!!

0

Le recomendé que utilice agregar marcador "@" con su nombre de parámetro. SqlParameter ayuda a agregar automáticamente, pero el parámetro de otros podría no hacerlo.

Cuestiones relacionadas