Passer les paramètres du tableau à SqlCommand en C#
En C#, lorsque vous essayez de transmettre des paramètres de tableau à une commande SQL, il peut y avoir un problème qui ne fonctionne pas comme prévu. La cause première est que les tableaux ne peuvent pas être ajoutés directement en tant que paramètres à SqlCommand. Pour résoudre ce problème, chaque valeur du tableau doit être ajoutée individuellement.
Solution :
Définir les paramètres du tableau :
Créez un tableau de paramètres avec les noms et types de données requis.
Ajouter des paramètres à SqlCommand :
Pour chaque valeur du tableau, ajoutez un nouvel objet SqlParameter et spécifiez le nom et la valeur correspondants. Si nécessaire, définissez le SqlDbType et la taille appropriés.
Remplacer la clause IN :
Remplacez l'espace réservé "{parameterNameRoot}" dans CommandText par une liste de noms de paramètres séparés par des virgules.
Exemple :
<code class="language-csharp">var parameters = new string[items.Length]; // 此处items应替换为实际的数组变量 var cmd = new SqlCommand(); for (int i = 0; i < items.Length; i++) { cmd.Parameters.AddWithValue("@param" + i, items[i]); } cmd.CommandText = cmd.CommandText.Replace("{param}", string.Join(",", Enumerable.Range(0, items.Length).Select(i => "@param" + i)));</code>
Solution améliorée :
Une solution améliorée et réutilisable peut être mise en œuvre comme méthode d'extension :
<code class="language-csharp">public static class SqlCommandExt { public static SqlParameter[] AddArrayParameters<T>(this SqlCommand cmd, string paramNameRoot, IEnumerable<T> values, SqlDbType? dbType = null, int? size = null) { var parameters = new List<SqlParameter>(); var parameterNames = new List<string>(); var paramNbr = 1; foreach (var value in values) { var paramName = string.Format("@{0}{1}", paramNameRoot, paramNbr++); parameterNames.Add(paramName); var p = new SqlParameter(paramName, value); if (dbType.HasValue) p.SqlDbType = dbType.Value; if (size.HasValue) p.Size = size.Value; cmd.Parameters.Add(p); parameters.Add(p); } cmd.CommandText = cmd.CommandText.Replace("{" + paramNameRoot + "}", string.Join(",", parameterNames)); return parameters.ToArray(); } }</code>
Utilisation :
<code class="language-csharp">var cmd = new SqlCommand("SELECT * FROM TableA WHERE Age IN ({Age})"); cmd.AddArrayParameters("Age", new int[] { 1, 2, 3 });</code>
Cet exemple amélioré utilise des génériques, ce qui le rend plus flexible et permet de spécifier SqlDbType et Size. Cela évite également le risque de sécurité potentiel lié à l’épissage des noms de paramètres directement dans CommandText. N'oubliez pas que lors de l'utilisation réelle, remplacez TableA
et Age
par les noms réels de vos tables et colonnes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!