在以下代码中,当我尝试更新表 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;
}
最佳答案
我建议只执行一个查询(我们不想通过查询 Oracle 两次、将数据提取到工作站来做额外的工作然后再次推送到 Oracle)。据我所见
"Update t_payment set amount = :amount where penalty_order_id = (select id from t_penalty_order where protokol_no = :invoiceNumber)";
code,你想更新 t_payment
表,通过将 some extra money 添加到 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
以防万一我们有 none - 在这种情况下额外的金额是 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();
}
关于c# - 无法在 C# 中执行多个 Oracle 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56578932/