2017-10-02 4 views
-1

をパラメータ化2)。アクセスが、私はこのクエリを実行しようとしていますIN()クエリ

「10」のみ、または「50」だけを入力すると、クエリごとに1行が返されます。

私はAccess 2013を使用していますが、何が間違っていますか?

私はそのようなクエリの作成
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); 
         } 
        } 

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

parameter.Valueは、そのような文字列が返されます: "10、50"

敬具

マイケル

+2

を実行することができますまたはそれ以上)の値 – Steve

+0

パラメータを構築するために使用したコードとデータベース – Steve

+0

の呼び出しを表示して、IN(10、50)に "10、50"を解決しないでください。 – Roofy

答えて

1

単一のパラメーターを使用して、IN節に渡す値のリストを表現することはできません。いくつかのORM(Dapperのような)があり、値のリストを渡して正しいIN句を作成することができます。

(あなたはこの方法

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

ようなものが必要同じことをしたい場合は今、あなただけの接続を設定する必要があり、単一のパラメータが2を表すことができないので、コマンド

関連する問題