【问题标题】:How to pass an array to an OracleParameter for IN condition?如何将数组传递给 OracleParameter for IN 条件?
【发布时间】:2020-02-17 09:00:03
【问题描述】:

这是我尝试执行 sql 命令的方式:

List<int> idsToDelete = new List<int>() { 1, 2, 3 };

string sqlDel = @"DELETE FROM products WHERE product_id IN (:idsToDelete)";

using (OracleCommand cmdDel = new OracleCommand(sqlDel, connexion))
{
    cmdDel.Parameters.Add("idsToDelete", idsToDelete.ToArray());
    cmdDel.ExecuteNonQuery();
}

我得到以下异常:

无法将对象形式类型“System.Int32[]”转换为类型“System.IConvertible”。

我使用以下命令得到了同样的异常:

string sqlDel = @"DELETE FROM products WHERE product_id IN :idsToDelete";

是否有一种为 IN 条件设置多值参数的正确方法? 我不想格式化命令字符串,因为它必须是可重用的。

【问题讨论】:

  • 您希望生成的 SQL 为“... IN (1,2,3)”吗?
  • string sqlDel = $@"DELETE FROM products WHERE product_id IN ({string.Join(", ", idsToDelete)})"; 或者你必须为idsToDelete中的每个项目创建一个参数

标签: c# sql oracle


【解决方案1】:

不知道这是否是最佳做法,但应该可以:

List<int> idsToDelete = new List<int>() { 1, 2, 3 };

string sqlDel = @"DELETE FROM products WHERE product_id IN (";
sqlDel += string.Join(", ", idsToDelete);
sqlDel += ")";

using (OracleCommand cmdDel = new OracleCommand(sqlDel, connexion))
{
    cmdDel.Parameters.Add("idsToDelete", idsToDelete.ToArray());
    cmdDel.ExecuteNonQuery();
}

如果有帮助,请告诉我。

【讨论】:

    【解决方案2】:

    您可以将项目加入IN

    List<int> idsToDelete = new List<int>() { 1, 2, 3 };
    
    string sqlDel = 
      $@"DELETE 
           FROM products 
          WHERE product_id IN ({string.Join(", ", idsToDelete)})";
    
    using (OracleCommand cmdDel = new OracleCommand(sqlDel, connexion))
    {
        cmdDel.ExecuteNonQuery();
    }
    

    或者为idsToDelete中的每个项创建参数:

    string sqlDel = 
      $@"DELETE 
           FROM products 
          WHERE product_id IN ({string.Join(", ", Enumerable.Range(0, idsToDelete).Select(i => $":prm_Del{i}"))})";
    
    using (OracleCommand cmdDel = new OracleCommand(sqlDel, connexion))
    {
        for (int i = 0; i < idsToDelete.Count; ++i) {
          //TODO: A better choice is explict parameter creation:
          //   cmdDel.Parameters.Add($":prm_Del{i}", idsToDelete[i], OracleType);  
          cmdDel.Parameters.AddWithValue($":prm_Del{i}", idsToDelete[i]);
        }
    
        cmdDel.ExecuteNonQuery();
    }
    

    【讨论】:

      【解决方案3】:

      试试String.Join()

      cmdDel.Parameters.Add("idsToDelete", string.Join(",", idsToDelete));
      

      【讨论】:

        猜你喜欢
        • 2017-01-23
        • 1970-01-01
        • 2017-08-29
        • 2016-01-12
        • 2021-05-17
        • 1970-01-01
        • 2020-05-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多