2008-12-30 7 views
4

Je voudrais appeler une instruction SQL telle que:En utilisant un opérateur « IN » avec un objet de commande SQL et C# 2.0

Select * From Table Where Column in ('value1', 'value2', 'value3') 

Est-ce aussi simple que la mise en valeur d'un paramètre de commande égal à « ('value1', 'value2', 'value3') » ?

+1

Est-ce qu'il y aura seulement 3 valeurs à match contre ou pourrait leur être plus? –

+0

Voir cette question précédente: http://stackoverflow.com/questions/182181/sqlparameter-conversion – Yuliy

+0

duplication possible de [Paramétrer une clause SQL IN?] (Http://stackoverflow.com/questions/337704/parameterizing-an- sql-in-clause) – Habib

Répondre

0

Si vous n'avez que trois paramètres pour la clause in alors oui vous pouvez utiliser les paramètres. Sinon, vous pouvez créer un SQL dynamique (attention aux attaques par injection SQL).

Une autre approche consiste à créer un fichier UDF qui prend une chaîne délimitée et renvoie une table. alors vous pouvez modifier votre requête à:

select * from 
table inner join 
dbo.fn_stringToTable(@params) 
0

Une autre option consiste à définir le CommandType de SqlCommand « texte » et construire la chaîne entière Sql dans le code ... Si l'on suppose la colonne est un varchar, et vous avez les valeurs dans une arrray chaîne, nommée « paramValues ​​»

 StringBuilder sbSql = new StringBuilder 
        ("Select * From Table Where Column in ("); 
     string[] paramValues = new string[] {"value1", "value2", "value3"}; 
     foreach (string val in paramValues) 
      sbSql.Append("'" + val + "', "); 
     sbSql = sbSql.Remove(sbSql.Length - 2, 2); 
     sbSql.Append(")"); 

     SqlCommand cmd = new SqlCommand(sbSql.ToString()); 
     cmd.CommandType = CommandType.Text; 
5

@Charles: Vous allez dans la bonne direction, mais nous utilisons des requêtes paramétrées pour empêcher principalement des injections SQL. Mettre des valeurs 'externes' (params string[] args) codées en dur dans les requêtes pose des problèmes. Vous pouvez itérer les arguments, mais vous devez toujours utiliser des paramètres comme ceci:

string[] values = new [] {"value1", "value2", "value3", "value4"}; 
    StringBuilder query = new StringBuilder("Select * From Table Where Column in ("); 
    SqlCommand cmd = new SqlCommand(); 
    cmd.Connection = new SqlConnection("Your connection string"); 
    for(int i = 0; i < columns.Length; i++) 
    { 
     string arg = string.Format("@arg{0}", i); 
     cmd.Parameters.AddwithValue(arg, SanatizeSqlString(columns[i])); 
     sb.AppendFormat("{0}, ", arg); 
    } 
    sb = sb.Remove(sb.Length -2, 2); 
    sb.Append(")"); 
    cmd.CommandText = sb.ToString(); 

De cette façon, vous vous retrouverez avec une requête comme:

select * from table where column in (@arg0, @arg1, @arg2, @arg3) 
Questions connexes