我正在调用在数据库中插入记录的存储过程,但是我想知道如何知道该存储过程已正确执行?为了知道制作了多少插入物,可以从网上验证?
我添加了用于调用存储过程的代码:
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();
}
运行存储过程的进程已经可以工作了,我只想知道是否有任何句子可以帮助您了解存储过程是否正确执行,因为作为特殊数据,存储过程不返回任何内容。
答案 0 :(得分:1)
您需要清理您的问题。您要插入还是选择数据?
“我正在调用插入记录的存储过程” 。 。 。da.Fill(dtTable);
????
如果选择数据,则您的SP必须具有RefCursor
out
参数
create or replace procedure X (pDataout OUT SYS_REFCURSOR)....
因此您需要添加相应的参数
cmd.Parameters.Add(pdata, OracleDbType.RefCursor) // NOTE correct usage
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();
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)`