Requêtes paramétrées avec les conditions LIKE et IN

Les requêtes paramétrées dans .Net ressemblent toujours à ceci dans les exemples:

SqlCommand comm = new SqlCommand(@" SELECT * FROM Products WHERE Category_ID = @categoryid ", conn); comm.Parameters.Add("@categoryid", SqlDbType.Int); comm.Parameters["@categoryid"].Value = CategoryID; 

Mais je cours dans un mur de briques en essayant de faire ce qui suit:

 SqlCommand comm = new SqlCommand(@" SELECT * FROM Products WHERE Category_ID IN (@categoryids) OR name LIKE '%@name%' ", conn); comm.Parameters.Add("@categoryids", SqlDbType.Int); comm.Parameters["@categoryids"].Value = CategoryIDs; comm.Parameters.Add("@name", SqlDbType.Int); comm.Parameters["@name"].Value = Name; 

  • CategoryIDs est une liste de nombres séparés par des virgules “123,456,789” (sans les guillemets)
  • Name est une chaîne, éventuellement avec des guillemets simples et d’autres caractères incorrects

Quelle est la bonne syntaxe pour cela?

Disons que vous avez vos identifiants de catégorie dans un tableau entier et que Name est une chaîne. L’astuce consiste à créer le texte de la commande pour vous permettre d’entrer tous vos identifiants de catégorie en tant que parameters individuels et de créer la correspondance floue pour le nom. Pour faire le premier, nous utilisons une boucle pour construire une séquence de noms de parameters @ p0 à @ pN-1 où N est le nombre d’identifiants de catégories dans le tableau. Nous construisons ensuite un paramètre et l’ajoutons à la commande avec l’ID de catégorie associé comme valeur pour chaque paramètre nommé. Ensuite, nous utilisons la concaténation sur le nom dans la requête elle-même pour permettre la recherche floue sur le nom.

 ssortingng Name = "someone"; int[] categoryIDs = new int[] { 238, 1138, 1615, 1616, 1617, 1618, 1619, 1620, 1951, 1952, 1953, 1954, 1955, 1972, 2022 }; SqlCommand comm = conn.CreateCommand(); ssortingng[] parameters = new ssortingng[categoryIDs.Length]; for(int i=0;i 

Ceci est une requête entièrement paramétrée qui devrait satisfaire votre DBA. Je soupçonne que puisque ce sont des nombres entiers, il ne serait pas très risqué de simplement construire le texte de la commande directement avec les valeurs, tout en paramétrant le nom. Si vos identifiants de catégorie se trouvent dans un tableau de chaînes, divisez simplement le tableau par des virgules, convertissez-les en entier et stockez-le dans le tableau d'entiers.

Remarque: je dis tableau et utilise-le dans l'exemple, mais cela devrait fonctionner pour n'importe quelle collection, même si votre itération sera probablement différente.

Idée originale de http://www.tek-tips.com/viewthread.cfm?qid=1502614&page=9

Vous avez besoin de “%” en valeur du paramètre sql.

 SqlCommand comm = new SqlCommand("SELECT * FROM Products WHERE Category_ID IN (@categoryid1, @categoryid2) OR name LIKE @name", conn); comm.Parameters.Add("@categoryid1", SqlDbType.Int); comm.Parameters["@categoryid1"].Value = CategoryID[0]; comm.Parameters.Add("@categoryid2", SqlDbType.Int); comm.Parameters["@categoryid2"].Value = CategoryID[1]; comm.Parameters.Add("@name", SqlDbType.Int); comm.Parameters["@name"].Value = "%" + Name + "%"; 

Cette approche ne fonctionnera pas. Période.

La clause IN attend une liste de parameters elle-même. Ainsi, lorsque vous lui associez un paramètre, vous avez la possibilité de transmettre une valeur.

Générez dynamicment votre chaîne d’instruction, avec le nombre exact d’espaces réservés individuels de clause IN que vous souhaitez transmettre, puis ajoutez des parameters et liez-leur des valeurs dans une boucle.

Je ne sais pas si c’est la bonne façon mais c’est une façon de le faire avant

liste templiste = nouvelle liste

comm.Parameters.Add (“@ categoriesids”, SqlDbType.varchar); comm.Parameters [“@ categoriesids”]. value = ssortingng.join (“,”, templist.toarray ())