2

In the following code when I try to update amount in the table t_payment, I expect it to be set the value of Convert.ToInt32(request.amount+ previous_paid_amount); whereas previous_paid_amount is assumed to be 0 instead of getting updated. So I am unable to use the updated value of previous_paid_amount variable.

Any help would be highly appreciated. Thanks

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;
}
1
  • there is something strange. previous_paid_amount is declared double, but is assigned int "previous_paid_amount = Convert.ToInt32(row2.GetValue(0))" then incremented with request.amount (typeof?) and the sum reconverted to int Commented Jun 13, 2019 at 11:47

2 Answers 2

1

I suggest executing just one query (we don't want to do extra work by querying Oracle twice, fetching data to the workstation then pushing at again to Oracle). As far as I can see from your

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

code, you want to update t_payment table by adding some extra money to amount field with condition applied:

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) 

We have to determine what is SOME_EXTRA_MONEY: we can try to derive it from query

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

So we have (I've added Sum in case we have several records, and that's why should sum them and Nvl in case we have none - in this case extra sum is 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)

Time to execute this query:

 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();
 } 
Sign up to request clarification or add additional context in comments.

1 Comment

Thank you very much Dmitry! Perfect solution!
0

It didn't work because you are using command instead of command2.

using (OracleDataReader row2 = command.ExecuteReader())

This needs to be modified with

 using (OracleDataReader row2 = command2.ExecuteReader())

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.