C# 无法在C中执行多个Oracle查询#

C# 无法在C中执行多个Oracle查询#,c#,sql,oracle,C#,Sql,Oracle,在下面的代码中,当我尝试更新表t\u payment中的金额时,我希望将其设置为Convert.ToInt32(request.amount+previous\u payment)的值而以前支付的金额假定为0,而不是更新。因此,我无法使用previous\u paid\u amount变量的更新值 任何帮助都将不胜感激。 谢谢 我建议只执行一个查询(我们不希望通过两次查询Oracle来做额外的工作,将数据提取到工作站,然后再次推送到Oracle)。据我从你的照片上所见 "Update t_pay

在下面的代码中,当我尝试更新表t\u payment中的金额时,我希望将其设置为
Convert.ToInt32(request.amount+previous\u payment)的值
以前支付的金额
假定为
0
,而不是更新。因此,我无法使用
previous\u paid\u amount
变量的更新值

任何帮助都将不胜感激。 谢谢

我建议只执行一个查询(我们不希望通过两次查询Oracle来做额外的工作,将数据提取到工作站,然后再次推送到Oracle)。据我从你的照片上所见

"Update t_payment set amount = :amount where penalty_order_id = (select id from t_penalty_order where protokol_no = :invoiceNumber)";
代码,您希望通过向
金额
字段添加一些额外的钱来更新
t\u付款
表,并应用以下条件:

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) 
我们必须确定什么是额外的钱:我们可以试着从查询中得到它

"select amount from t_payment where penalty_order_id = (select id from t_penalty_order where protokol_no = :invoiceNumber)";
所以我们有(我已经添加了
Sum
,以防我们有多条记录,这就是为什么我们应该对它们进行求和,如果我们没有记录,则添加
Nvl
——在这种情况下,额外的总和是
0
):

执行此查询的时间:

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

它不起作用,因为您使用的是command而不是command2

using (OracleDataReader row2 = command.ExecuteReader())
这需要使用

 using (OracleDataReader row2 = command2.ExecuteReader())

非常感谢你,德米特里!完美的解决方案!有点奇怪。上一次支付的金额声明为double,但分配给int“上一次支付的金额=Convert.ToInt32(row2.GetValue(0)),然后随request.amount(typeof?)递增,并将总和重新转换为int
using (OracleDataReader row2 = command.ExecuteReader())
 using (OracleDataReader row2 = command2.ExecuteReader())