Запрос на слияние возвращает -1 вместо количества объединенных строк

У нас есть старое приложение, которое работает с базой данных Oracle и использует наборы данных, таблицы данных и адаптеры таблиц. Он использует устаревший System.Data.OracleClient, и мы планируем заменить эту dll библиотекой от DevArt.

Я использовал мастер миграции Oracle для миграции с System.Data.OracleClient на Devart.Data.Oracle. После миграции все запросы продолжают нормально работать, кроме одного типа: запросы MERGE. Они по-прежнему отлично объединяют записи (ожидаемые записи вставляются/обновляются). Однако раньше возвращалось количество объединенных записей, но теперь вместо этого всегда возвращается «-1».

Есть идеи, в чем может быть проблема? Желательно без ручного обновления всех мерж-запросов (их много), но если обновление всех запросов — единственный способ решить эту проблему, то это приемлемо.

Код, который обрабатывает подключение к базе данных, генерируется файлом DataSet:

Devart.Data.Oracle.OracleCommand command = "MERGE INTO [...]";
System.Data.ConnectionState previousConnectionState = command.Connection.State;
if ((command.Connection.State & System.Data.ConnectionState.Open) != System.Data.ConnectionState.Open)
{
    command.Connection.Open();
    int returnValue;
    try
    {
        returnValue = command.ExecuteNonQuery();
    }
    finally
    {
        if (previousConnectionState != System.Data.ConnectionState.Closed)
        {
            command.Connection.Close();
        }
    }
}
return returnValue;

person Sam    schedule 21.08.2015    source источник
comment
Этот пост на SO может вам помочь. stackoverflow.com/questions/23601304/   -  person Ramesh Babu    schedule 21.08.2015
comment
@RameshBabu Другая проблема: в моем случае слияние «прилипает» (обновления и вставки происходят). У меня проблема с возвращаемым значением. При этом я попробовал упомянутое решение, но добавление Direct = true в строку подключения только приводит к тому, что приложение вообще не может подключиться.   -  person Sam    schedule 21.08.2015
comment
Добавьте фрагмент кода, который может помочь вам получить ответы.   -  person Exhausted    schedule 21.08.2015
comment
@Exhausted Его код сгенерирован набором данных, но я его добавил.   -  person Sam    schedule 21.08.2015


Ответы (2)


Я нашел статью о переходе с клиента оракула на devart. Он в основном говорит: «Вот как работает Деварт». Вы можете найти подробности ниже:

Devart может вернуть количество затронутых строк только для команд INSERT, UPDATE и DELETE DML, во всех остальных случаях он возвращает -1. Иногда мы использовали эти возвращаемые значения в нашем API, чтобы указать, была ли операция успешной или нет. С этими тремя DML-командами все в порядке. У нас также есть несколько применений команды Oracle MERGE, OracleClient может вернуть правильное количество затронутых строк, devart возвращает -1. Мы изменили наш API, где используется MERGE, чтобы не учитывать возвращаемое значение.

чтобы прочитать статью полностью, нажмите здесь

person umut    schedule 21.08.2015
comment
К сожалению, кажется, что «не работает, заменить на UPDATE/INSERT» — единственное возможное решение в моем случае. - person Sam; 24.08.2015
comment
Менять что-то на уровне инфраструктуры всегда болезненно... Надеюсь, вы найдете лучший способ, но пока вам кажется, что вам нужно придерживаться его. - person umut; 25.08.2015

В ODP.NET ExecuteNonQuery для инструкции Oracle merge также возвращается -1. Единственный известный мне обходной путь — вызвать его в блоке PLSQL и использовать SQL%ROWCOUNT, как здесь:

  string sql =
      "begin " +
      "  merge into test t1 " +
      "    using (select col1, col2 from test) t2 on (t2.col1=t1.col1) " +
      "    when matched then update set col2=col2+1; " +
      "  :num := sql%rowcount; "+
      "end;";
  OracleCommand cmd = new OracleCommand(sql, myConnection);
  var p = cmd.Parameters.Add(":num", OracleDbType.Int32, ParameterDirection.Output);
  cmd.ExecuteNonQuery();
  Console.WriteLine("Rows affected: " + p.Value);

--------------------------
Sample output for my data: 
Rows affected: 2

Я надеюсь, что вы получите/найдёте лучшие ответы для Деварта.

person Ponder Stibbons    schedule 21.08.2015