C# 无法在C中执行多个Oracle查询#
在下面的代码中,当我尝试更新表t\u payment中的金额时,我希望将其设置为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
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())