【问题标题】:How to know if a stored procedure was executed correctly?如何知道存储过程是否正确执行?
【发布时间】:2019-10-31 14:05:39
【问题描述】:

我正在调用一个在数据库中插入记录的存储过程,但我想知道如何判断存储过程是否正确执行?为了知道插入了多少,可以从网络上验证吗?

我添加了我用来调用存储过程的代码:

public void EjecutaSP(string NomSP, ParametroOracle[] Parameter, string OracleCon)
{
    OracleCon = Rijndael.Desencriptar(strOracleCon);
    OracleConnection oracleCon = new OracleConnection(OracleCon);

    try
    {
        OracleCommand cmd = new OracleCommand(NomSP, oracleCon);
        cmd.CommandType = CommandType.StoredProcedure;

        cmd.Parameters.Add("DateProcess", "OracleType.VarChar").Value = "'2019-05-29'";
        cmd.Parameters.Add("EmployeeGroup", "OracleType.Number").Value = 555501;
        cmd.Parameters.Add("IdEmployee", "OracleType.Number").Value = 555501;

        cmd.Parameters.Add("NomEmployee", "OracleType.VarChar").Value = "'Espanol'";

        OracleDataAdapter da = new OracleDataAdapter(cmd);
        DataTable dtTable = new DataTable();

        da.Fill(dtTable);
    }
    catch (Exception ex)
    {
        string strSP = NomSP;
        int intPar = Parameter.Length;

        for (int i = 0; i < intPar; i++)
            strSP += " ," + Parameter[i].Valor;

        Exception _ex = new Exception("Error en SP: " + strSP, ex.InnerException);
        throw _ex;
    }
    finally
    {
        oracleCon.Close();
        oracleCon.Dispose();
    }
}    

运行存储过程的进程已经运行,我想知道是否有任何句子可以帮助了解存储过程是否正确执行,因为存储过程没有返回任何特殊数据。

【问题讨论】:

  • 您可以简单地在存储过程中返回插入的记录并检查是否为空。
  • 为什么将日期作为 varchar 传递?那些' 是否应该在"'Espanol'" 中?
  • 如果您不使用,请在 SP 中使用 try catch 并添加一个 out 参数,并在成功和数据库异常/失败的情况下返回一些唯一值。我通常这样做,从来没有遇到过麻烦。并在你的 c# 中检查它。

标签: c# oracle stored-procedures odp.net


【解决方案1】:
  1. 您需要清理您的问题。您是在插入还是选择数据? “我正在调用一个插入记录的存储过程”。 . .da.Fill(dtTable); ????

  2. 如果选择数据,你的SP必须有RefCursorout参数

create or replace procedure X (pDataout OUT SYS_REFCURSOR)....

因此你需要添加相应的参数

cmd.Parameters.Add(pdata, OracleDbType.RefCursor) // NOTE correct usage
  1. 对于您的问题... 存储过程不会返回受影响的记录数,比如说,使用ExecuteNonQuery。如果您只是想知道 SP 是否成功,如果您没有错误,那就是。如果您没有处理您的 SP 中的错误,并且出现故障,那么一切都将被回滚。要么全有,要么全无。您可以在 c# 中捕获异常并使用它。避免在 SP 内处理错误。
create or replace procedure X (...)
AS
 . .  .
Begin
    insert into . . . 
End;

如果您在 SP 中有多个 DML,并且您想知道有多少行受到影响,您需要为它构建您的 SP

create or replace procedure X (pAffected out number)
AS
 . .  .
Begin
    insert into A. . . 
    pAffected := SQL%ROWCOUNT;

    insert into B. . . 
    pAffected := pAffected + SQL%ROWCOUNT;
End;

而在 c# 中只需获取值

 cmd.Parameters.Add("pAffected", OracleDbType.Decimal, ParameterDirection.Output)
 . . .  . . . 
 int count = ((OracleDecimal)cmd.Parameters["pAffected"].Value).ToInt32();
  1. 代码构造
using (var conn = new OracleConnection(.......))
using (var cmd = new OracleCommand(.......))
{
  // . . . . .  CODE HERE ........   
  using (var adp = new OracleDataAdapter(....) // if you need to fill table
  {
      // fill table
  }
}
// NOTE: no need close/dispose (automatic with using). Transaction committed internally. 
// If SP errors out, everything is rolled back. Wrap this into `Try/Catch(OracleException ex)`

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 2021-12-18
    • 2014-08-09
    • 1970-01-01
    • 2019-07-15
    相关资源
    最近更新 更多