Как передать массив в OracleParameter для условия IN? - PullRequest
0 голосов
/ 21 октября 2019

Вот способ, которым я пытаюсь выполнить команду 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? Я не хочу форматировать командную строку, потому что она должна быть многоразовой.

Ответы [ 3 ]

1 голос
/ 21 октября 2019

Вы можете объединить элементы в 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();
}
1 голос
/ 21 октября 2019

Не знаю, является ли это наилучшей практикой, но она должна работать:

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

Дайте мне знать, если это помогло.

0 голосов
/ 21 октября 2019

Попробуйте String.Join ()

cmdDel.Parameters.Add("idsToDelete", string.Join(",", idsToDelete));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...