2017-10-02 2 views
-1

Ich versuche, diese Abfrage auszuführen:Zugang parametrisiert IN() Abfrage

SELECT * FROM Tabela1 WHERE Pole1 IN (@parameter) 

Wenn das Fenster mit „Wert auswählen“ erscheint, habe ich: „10, 50“ und ich erhalte 0 Zeilen (sollte 2).

Wenn ich nur "10" oder nur "50" setze funktioniert es und gibt 1 Zeile für jede Abfrage zurück.

Ich benutze Access 2013 - was mache ich falsch?

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); 
         } 
        } 

Ich schaffe die Abfrage wie folgt aus:

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

die parameter.Value gibt Zeichenfolge wie folgt aus: "10, 50"

Mit freundlichen Grüßen

Michael

+2

ausgeführt werden, da ein einzelner Parameter nicht zwei darstellen kann (oder mehr) Werte – Steve

+0

Bitte zeigen Sie den Code, den Sie verwendet haben, um den Parameter und den Aufruf Ihrer Datenbank – Steve

+0

zu erstellen, so dass es nicht "10, 50" in IN (10, 50) auflösen? – Roofy

Antwort

1

Sie können keinen einzelnen Parameter verwenden, um eine Liste von Werten auszudrücken, die an eine IN-Klausel übergeben werden sollen. Es gibt einige ORM (wie Dapper zum Beispiel), mit denen Sie eine Liste von Werten übergeben und für Sie die richtige IN-Klausel erstellen können.

Wenn Sie das Gleiche tun wollen, müssen Sie so etwas wie dieses Verfahren

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; 
} 

Sie nun müssen Sie nur noch die Verbindung und Sie können den Befehl

Verwandte Themen