Невозможно выполнить несколько запросов Oracle в C # - PullRequest
2 голосов
/ 13 июня 2019

В следующем коде, когда я пытаюсь обновить сумму в таблице t_payment, я ожидаю, что для нее будет установлено значение Convert.ToInt32(request.amount+ previous_paid_amount);, тогда как previous_paid_amount вместо обновления будет считаться 0.Поэтому я не могу использовать обновленное значение переменной previous_paid_amount.

Любая помощь будет принята с благодарностью.Спасибо

double previous_paid_amount = 0;
try {
  OracleCommand command2 = new OracleCommand();

  command2.CommandText = "select amount from t_payment where penalty_order_id = (select id from t_penalty_order where protokol_no = :invoiceNumber)";

  command2.Parameters.Add(new OracleParameter(@"invoiceNumber", OracleDbType.Varchar2, 255)).Value = request.invoiceNumber;

  command2.Connection = connection;
  command2.CommandType = System.Data.CommandType.Text;

  using (OracleDataReader row2 = command.ExecuteReader()) {
    while (row2.Read()) {
      previous_paid_amount = Convert.ToInt32(row2.GetValue(0));
    }
  }
}
catch (Exception e) {
  completePayment.code = 111;
  completePayment.message = e.Message;
  completePayment.transactionNumber = null;
}

// update the paid amount by adding the current amount
try {
  OracleCommand command2 = new OracleCommand();

  command2.CommandText = "Update t_payment set amount = :amount where penalty_order_id = (select id from t_penalty_order where protokol_no = :invoiceNumber)";

  command2.Parameters.Add(new OracleParameter(@"amount", OracleDbType.Int32)).Value = Convert.ToInt32(request.amount+ previous_paid_amount);
  command2.Parameters.Add(new OracleParameter(@"invoiceNumber", OracleDbType.Varchar2, 255)).Value = request.invoiceNumber;

  command2.Connection = connection;
  command2.CommandType = System.Data.CommandType.Text;
  command2.ExecuteNonQuery();
}
catch (Exception e) {
  completePayment.code = 111;
  completePayment.message = e.Message;
  completePayment.transactionNumber = null;
}

Ответы [ 2 ]

1 голос
/ 13 июня 2019

Я предлагаю выполнить только один запрос (мы не хотим выполнять дополнительную работу , запросив Oracle дважды , загрузив данные на рабочую станцию ​​и нажав Agian для Oracle). Насколько я вижу из вашего

"Update t_payment set amount = :amount where penalty_order_id = (select id from t_penalty_order where protokol_no = :invoiceNumber)";

код, вы хотите обновить t_payment таблицу, добавив немного дополнительных денег к amount полю с примененным условием:

update t_payment
   set amount = amount + SOME_EXTRA_MONEY
 where penalty_order_id in (select p.id 
                              from t_penalty_order p
                             where p.protokol_no = :invoiceNumber) 

Мы должны определить, что такое SOME_EXTRA_MONEY: мы можем попытаться вывести его из запроса

"select amount from t_payment where penalty_order_id = (select id from t_penalty_order where protokol_no = :invoiceNumber)";

Итак, у нас есть (я добавил Sum на случай, если у нас несколько записей, и поэтому нужно их суммировать и Nvl на случай, если у нас нет - в в этом случае дополнительная сумма 0):

update t_payment
   set amount = amount + (select Nvl(Sum(t.amount), 0) 
                            from t_payment t 
                           where t.penalty_order_id in (select p.id 
                                                          from t_penalty_order p
                                                         where p.protokol_no = :invoiceNumber))
 where penalty_order_id in (select p.id 
                              from t_penalty_order p
                             where p.protokol_no = :invoiceNumber)

Время выполнения этого запроса:

 using (OracleCommand command2 = new OracleCommand()) {
   command2.CommandText =
     @"update t_payment
          set amount = amount + (select Nvl(Sum(t.amount), 0) 
                                   from t_payment t 
                                  where t.penalty_order_id in (select p.id 
                                                                 from t_penalty_order p
                                                                where p.protokol_no = :invoiceNumber))
        where penalty_order_id in (select p.id 
                                     from t_penalty_order p
                                    where p.protokol_no = :invoiceNumber)";

   command2.Parameters.Add(
     new OracleParameter(@"invoiceNumber", OracleDbType.Varchar2, 255)
   ).Value = request.invoiceNumber;

   command2.ExecuteNonQuery();
 } 
0 голосов
/ 13 июня 2019

Это не сработало, потому что вы используете команду вместо command2.

using (OracleDataReader row2 = command.ExecuteReader())

Это необходимо изменить с помощью

 using (OracleDataReader row2 = command2.ExecuteReader())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...