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ónAl 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.
- http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.parameters.aspx
- http://msdn.microsoft.com/en-us/library/yy6y35y8.aspx
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)