ver sp_send_dbmail procedimientos procedimiento hacer funciones funcion entre ejemplos ejecutar diferencia como codigo buscar almacenados almacenado sql-server-2005 stored-procedures ado.net parameters

sp_send_dbmail - Diferencia entre agregar parámetros al procedimiento almacenado en SQL Server 2005



sp_send_dbmail ejemplos (2)

Me gustaría saber la diferencia entre estas 2 notaciones.

Antes que nada, tengo un procedimiento almacenado

CREATE PROCEDURE AddSomething( @zonename varchar(50), @desc varchar(255), @TheNewId int OUTPUT ) AS BEGIN INSERT INTO a_zone(zonename, descr) VALUES(@zonename, @desc) SELECT @TheNewId = SCOPE_IDENTITY() END

¿Cuál es la diferencia si agrego parámetros de esta manera?

SqlCommand Cmd = new SqlCommand("AddSomething", oConn); Cmd.CommandType = CommandType.StoredProcedure; SqlParameter oParam1 = Cmd.Parameters.AddWithValue("@zonename", sName); SqlParameter oParam2 = Cmd.Parameters.AddWithValue("@desc", description);

y

SqlCommand Cmd2 = new SqlCommand("AddSomething", oConn); Cmd2.CommandType = CommandType.StoredProcedure; cmd2.Parameters.Add("@zonename", SqlDbType.VarChar).Value = zonename.Text.Trim(); cmd2.Parameters.Add("@desc", SqlDbType.VarChar).Value = desc.Text.Trim();

por favor, ayúdame

Gracias de antemano


Cuando use AddWithValue, el tipo de datos se calculará (lo mejor posible) según los tipos de variables pasadas al método: suponiendo que sName y description son variables de cadena, los parámetros se pasarán como NVARCHAR.

Yo personalmente prefiero el segundo enfoque, siendo explícito con los tipos de datos (además de que realmente también especifico los tamaños) para garantizar que coincidan con la definición de sproc y evitar cualquier comportamiento inesperado.


Aquí hay algunas explicaciones:

diferencia entre el comando Agregar y AddWithValue

Dim cmd as new SqlCommand("SELECT * FROM MyTable WHERE MyDate>@TheDate",conn) cmd.Parameters.Add("@TheDate",SqlDbType.DateTime).Value="2/1/2007"

vs

cmd.Parameters.AddWithValue("@TheDate","2/1/2007")

"Agregar fuerza la conversión de una cadena a otra a medida que ingresa en el parámetro. AddWithValue simplemente habría pasado la cadena al SQL Server.

Al usar Parameters.Add : el S qlDbTypeis conocido en tiempo de compilación

Al usar Parameters.AddWithValue el método tiene que encajonar y desempaquetar el valor para descubrir su tipo.

Los beneficios adicionales de la primera son que Add es un poco más seguro con el código y ayudará contra los ataques de inyección sql, el código es seguro en términos de que si intentas pasar un valor que no coincide con el tipo sqldb definido, el error quedará atrapado en .Código de red y no tendrá que esperar el viaje de ida y vuelta.

Editar :

ejemplo para obtener un parámetro de salida:

DO#

cmd.Parameters.Add(new SqlParameter("@TheNewId", SqlDbType.Int, int.MaxValue)); cmd.Parameters("@TheNewId").Direction = ParameterDirection.Output; cmd.ExecuteNonQuery(); int theNewID = (int)cmd.Parameters("@TheNewId").Value;

VB.Net

cmd.Parameters.Add(New SqlParameter("@TheNewId", SqlDbType.Int, Int32.MaxValue)) cmd.Parameters("@TheNewId").Direction = ParameterDirection.Output cmd.ExecuteNonQuery() Dim theNewID As Int32 = DirectCast(cmd.Parameters("@TheNewId").Value, Int32)