¿Es necesario agregar un @ delante de un nombre SqlParameter?

En una de nuestras aplicaciones los parámetros pasaron a un procedimiento almacenado de esta manera

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 del código es searchText y que en el procedimiento almacenado es @searchText .

Pero funciona correctamente, siempre obtengo los resultados requeridos.

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

De acuerdo con la documentación , el nombre debe comenzar con un @ :

El ParameterName se especifica en la forma @paramname.

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

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

Ref: propiedad SqlParameter.ParameterName y propiedad IDataParameter.ParameterName

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 del nombre del parámetro.

el nombre de tu parámetro debe ser el mismo que el de backend, por ej. tienes @searchText luego en tu especificación de parámetro debe ser SqlParameter("@searchText"

tu código debería 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 usan caracteres diferentes de uso diferente para especificar el parámetro y puede haber @ el símbolo no se usa especificado por la especificación de ado.net.

Editar: por comentarios

Como ha especificado el enlace , también es una especie de solución, pero según la documentación de msdn, debe especificar el parámetro de posición con ‘@’ si está utilizando cualquier proveedor de datos oledb, sql, odbc. Árbitro

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

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 nuevamente, es una mejor práctica definirlos como:

 string s = string.Empty; 

Ya ves, ¡es una cuestión de convenciones y mejores prácticas!

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