Il y a une question liée à ceci:
Quelle est la meilleure méthode pour passer des paramètres à SQLCommand?
Mais je suis désireux de savoir quelles sont les différences et, si il y a des problèmes avec les diverses manières.
J'ai l'habitude d'utiliser une structure à quelque chose comme ceci:
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
}
Maintenant, il y a plusieurs façons d'ajouter de la cmd paramètres et je me demande qui est le mieux:
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");
Ayant la longueur du champ dans le passage de la varchars je suppose n'est pas préférable, car c'est une valeur magique qui peut être changé plus tard à la base de données. Est-ce correct? Ne provoque aucun problème en passant un varchar de cette façon (performance ou d'autres), je suppose que c'est par défaut de type varchar(max) ou la base de données équivalent. Je suis raisonnablement satisfait de cette volonté de travail.
La partie qui m'inquiète plus, c'est la perte de la SqlDbType enum si je suis à l'aide de la troisième ou de la quatrième options que j'ai énumérés ci-dessus, je ne suis pas la fourniture d'un type à tous. Existe-il des cas où cela ne fonctionne pas, je peux imaginer des problèmes avec varchar mal exprimés char ou vice versa, ou peut-être des problèmes avec virgule pour de l'argent....
En termes de base de données le type de champ que je voudrais dire, c'est beaucoup moins susceptible de changer que la longueur est-il donc la peine de le garder?