2017-10-02 6 views
-1

Je suis en train d'exécuter cette requête:accès paramétrés IN() requête

SELECT * FROM Tabela1 WHERE Pole1 IN (@parameter) 

Lorsque la fenêtre avec « choisir la valeur » apparaît, je mets: « 10, 50 » et je reçois 0 lignes (devrait être 2).

Lorsque je mets seulement "10", ou seulement "50" cela fonctionne et renvoie 1 ligne pour chaque requête. J'utilise Access 2013 - que fais-je de mal?

using (DbConnection connection = new T()) 
      { 
       connection.ConnectionString = query.DatabaseConnection.ConnectionString; 
       using (DbCommand command = connection.CreateCommand()) 
       { 
        command.CommandText = query.QuerySql.Sql; 
        command.CommandType = CommandType.Text; 
        command.CommandTimeout = query.QuerySql.CommandTimeout; 

        if (query.QuerySql.Parameters != null) 
        { 
         foreach (var parameter in query.QuerySql.Parameters) 
         { 
          var commandParameter = command.CreateParameter(); 
          commandParameter.ParameterName = $"@{parameter.Name}"; 
          commandParameter.Value = parameter.Value; 
          command.Parameters.Add(commandParameter); 
         } 
        } 

je crée la requête comme ça:

QuerySql sql = new QuerySql("SELECT * FROM Tabela1 WHERE Pole1 IN(@parameter)", new List<ISqlParameter>() 
     { 
      new SqlMultiNumberParameter("parameter", new List<string>() { "10", "50" }, "Test parameter") 
     }); 

la parameter.value retourne la chaîne comme ça: "10, 50"

Meilleures salutations

Michael

+2

Parce qu'un seul paramètre ne peut pas représenter deux (ou plus) valeurs – Steve

+0

S'il vous plaît montrer le code que vous avez utilisé pour construire le paramètre et l'appel à votre base de données – Steve

+0

de sorte qu'il ne résout pas "10, 50" en IN (10, 50)? – Roofy

Répondre

1

Vous ne pouvez pas utiliser un seul paramètre pour exprimer une liste de valeurs à transmettre à une clause IN. Il y a des ORM (comme Dapper par exemple) qui vous permettent de passer une liste de valeurs et de construire pour vous la bonne clause IN.

Si vous voulez faire la même chose que vous besoin de quelque chose comme cette méthode

public OleDbCommand GetPoles(List<int> polesID) 
{ 
    // Base text of the query 
    string cmdText = @"SELECT * FROM TABLE1 WHERE Pole1 IN("; 

    // where we store the 'name' of the parameters. (OleDb doesn't care) 
    List<string> inClause = new List<string>(); 

    // where we store the parameters and their values 
    List<OleDbParameter> parameters = new List<OleDbParameter>(); 
    foreach(int id in polesID) 
    { 
     // Add a placeholder for the parameter 
     inClause.Add("?"); 

     // Build the parameter and store it away 
     OleDbParameter p = new OleDbParameter("p" + id.ToString(), OleDbType.Integer); 
     p.Value = id; 
     parameters.Add(p); 
    } 

    OleDbCommand cmd = new OleDbCommand(); 

    // Build the command text: IN(?,?,?). A ? placeholder for each parameter 
    cmd.CommandText = cmdText + string.Join(",", inClause.ToArray()) + ")"; 

    // pass all the parameters to the command and return it 
    cmd.Parameters.AddRange(parameters.ToArray()); 
    return cmd; 
} 

Maintenant, il vous suffit de définir la connexion et vous pouvez exécuter la commande