hay una pregunta en relación con esto:¿Cuándo se deben usar "SqlDbType" y "size" al agregar los parámetros de SqlCommand?
What's the best method to pass parameters to SQLCommand?
pero estoy con ganas de saber cuáles son las diferencias y si hay algún problema con los diferentes maneras.
lo general el uso de una estructura algo como esto:
using (SqlConnection conn = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand(SQL, conn))
{
cmd.CommandType = CommandType.Text;
cmd.CommandTimeout = Settings.Default.reportTimeout;
cmd.Parameters.Add("type", SqlDbType.VarChar, 4).Value = type;
cmd.Connection.Open();
using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
{
adapter.Fill(ds);
}
//use data
}
Ahora bien, hay varias formas de agregar los parámetros cmd y me pregunto cuál es el mejor:
cmd.Parameters.Add("@Name", SqlDbType.VarChar, 20).Value = "Bob";
cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = "Bob";
cmd.Parameters.Add("@Name").Value = "Bob";
cmd.Parameters.AddWithValue("@Name", "Bob");
que tiene la longitud de la campo en el paso de los varchar, supongo que no es preferible, ya que es un valor mágico que se puede cambiar más adelante en la base de datos. ¿Es esto correcto? ¿Provoca algún problema que pase un varchar de esta manera (rendimiento u otro)? Supongo que tiene como valor predeterminado varchar (max) o el equivalente de la base de datos. Estoy razonablemente feliz de que esto funcione.
La parte que me preocupa más es la pérdida de la enumeración SqlDbType si utilizo la tercera o cuarta opción que enumeré anteriormente. No estoy suministrando ningún tipo. ¿Hay casos en que esto no funcione? Puedo imaginar problemas con varchar siendo incorrectamente lanzado a char o viceversa o quizás problemas con decimal a dinero ...
En términos de la base de datos, el tipo de campo que yo diría es es mucho menos probable que cambie la longitud, ¿vale la pena retener?
Si bien no responde su pregunta, ¿sabe que no necesita abrir la conexión antes de llamar 'SqlDataAdapter.Fill()', y que hay beneficio en no hacerlo? –
@Rowland buen punto. Lo sabía, aunque ha sido un descuido en mi código. Creo que tomé el bloque de código original de algún lugar donde estaba usando un SqlDataReader, no un adaptador (¿Necesitas abrir la conexión para ese derecho?). Eso es lo que obtienes por la programación traviesa de copiar/pegar :-). Corregido en mi código ahora. – PeteT
pensé en mencionarlo, ya que es uno de esos "consejos oscuros que la gente podría no conocer" –