如何知道存储过程是否正确执行?

时间:2019-06-18 00:50:40

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

我正在调用在数据库中插入记录的存储过程,但是我想知道如何知道该存储过程已正确执行?为了知道制作了多少插入物,可以从网上验证?

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

    try {
          $dbh = new PDO("mysql:host=localhost;dbname=test","root","");
          $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

      if(
          isset($_POST['fname'])
          && isset($_POST['lname'])
          && isset($_POST['email'])
        ){  

      if(isset($_POST['submit']));

      $number = array(count($_POST["fname"]), count($_POST["lname"]), count($_POST["email"]) );

      if($number > 1)
      {
        for($i=0; $i<$number; $i++)
        {
            $fname = trim($_POST['fname']);
            $lname = trim($_POST['lname']);
            $email = trim($_POST['email']);
            $referalid = $userid;

             $stmt = $dbh ->prepare("INSERT INTO refer_friend (fname, lname, referalid, email)VALUES(:fname,:lname,:referalid,:email)");
             if($stmt){
                            $stmt->bindParam(':fname',$fname); 
                            $stmt->bindParam(':lname',$lname);
                            $stmt->bindParam(':referalid',$referalid);
                            $stmt->bindParam(':email',$email);
              $stmt->execute();
                    echo ("successful");
                    }//End stmt execute
                break;
        }//end if number > 0
    } //end isset
  } //end try
}
      catch(PDOException $e)
      {
        echo "Connection failed: " . $e->getMessage();
      }

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

1 个答案:

答案 0 :(得分:1)

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

  2. 如果选择数据,则您的SP必须具有RefCursor out参数

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)`