Passage d'une collection de parameters SQL à une fonction

Lorsque j'écris des applications CRUS ASP.NET en C #, je me retrouve souvent à insert de nombreux codes répétitifs pour extraire des requêtes SQL Server dans des tables de données, extraire des valeurs scalaires à partir de requêtes dans des variables, appeler des procédures stockées, etc.

Récemment, j'ai essayé de refactoriser cela en créant des classs generics et des methods pour gérer ces tâches de base. Cependant, pour que ceux-ci fonctionnent correctement, ils doivent être en mesure de prendre un nombre arbitraire de parameters. La class SqlParameterCollection semblait être le premier choix évident, mais cette class ne peut malheureusement pas être instanciée à partir du code user. L'option suivante consistait à passer un List<SqlParameter> à la fonction, puis à utiliser foreach pour append son contenu à la collection de parameters embeddede de SqlCommand . Cela a fonctionné, mais la déclaration est un peu maladroite.

Pour créer la list dans le code avant d'appeler la fonction, je dois faire quelque chose comme ceci:

 List<SqlParameter> ParameterList = new List<SqlParameter> { new SqlParameter() { ParameterName = "@Parameter1", SqlDbType = SqlDbType.VarChar, Value = InputVariable1 }, new SqlParameter() { ParameterName = "@Parameter2", SqlDbType = SqlDbType.VarChar, Value = InputVariable2 }, new SqlParameter() { ParameterName = "@Parameter3", SqlDbType = SqlDbType.VarChar, Value = InputVariable3 } }; 

Ceci est difficile à lire sur les petits moniteurs et contient encore beaucoup de passe-partout répétitif. Ma prochaine étape consistait donc à créer une class personnalisée avec une méthode Add surchargée afin que cela ne soit pas nécessaire. J'ai lu qu'il est mauvais de sous-classr List en C #, j'ai donc utilisé Collection place:

 public class ParameterCollection : Collection<SqlParameter> { public void Add(ssortingng ParameterName, SqlDbType ParameterType, object ParameterValue) { // Create the parameter and add it to the list SqlParameter Parameter = new SqlParameter(); Parameter.ParameterName = ParameterName; Parameter.SqlDbType = ParameterType; Parameter.Value = ParameterValue; base.Add(Parameter); // Done return; } } 

Je peux ensuite déclarer une collection de parameters comme ceci:

 ParameterCollection Parameters = new ParameterCollection { // name type value { "@Parameter1", SqlDbType.VarChar, InputVariable1 }, { "@Parameter2", SqlDbType.VarChar, InputVariable2 }, { "@Parameter3", SqlDbType.VarChar, InputVariable3 } }; 

Ma question est la suivante: existe-t-il un moyen plus rapide / plus facile d'effectuer cette tâche que je néglige? Et y a-t-il des pièges potentiels cachés ou de mauvaises pratiques dans la façon dont je le fais actuellement?

Une chose que vous avez peut-être oubliée est que Add renvoie le paramètre ajouté, ce qui nous permet de définir la valeur dans la même instruction:

 cmd.Parameters.Add("@Parameter1", SqlDbType.VarChar).Value = paramValue; 

Plutôt que d'instancier et de passer une collection – qui, comme vous le dites, est gênée par SqlParameterCollection n'ayant pas de constructor public -, vous pouvez passer la collection indirectement, en passant la command SqlCommand elle-même. Vos classs et methods generics peuvent ensuite append des parameters à SqlCommand.Parameters , ce qui vous évite d'avoir à instancier une collection séparée.