C#显示Oracle过程中的自定义错误

本文关键字:自定义 错误 过程中 显示 Oracle | 更新日期: 2023-09-27 17:59:14

create or replace procedure naujas_veiksmai(
vartotojas number,
knyga number,
kiekis number,
grazinta VARCHAR2,
tipas varchar2,
error_msg out varchar2
)
is
begin
insert into veiksmai values(vt_id_seq.nextval,vartotojas,knyga,kiekis,tipas,sysdate,TO_DATE(grazinta,'YYYY-MM-DD'));
exception 
when OTHERS THEN error_msg := 'Irasant ivyko klaida'; 
end;

这是一个必须向程序返回自定义错误的过程。

C#代码:

OracleCommand cmd = new OracleCommand();
                    cmd.Connection = conn;
                    cmd.CommandText = "naujas_veiksmai";
                    cmd.CommandType = CommandType.StoredProcedure;
                    OdbcParameter param = new OdbcParameter();
                        cmd.Parameters.Add("vartotojas", OracleType.Number).Value = vartotojas;
                        cmd.Parameters.Add("knyga", OracleType.Number).Value = knyga;
                        cmd.Parameters.Add("kiekis", OracleType.Number).Value = kiekis;
                        cmd.Parameters.Add("grazinta", OracleType.VarChar).Value = grazinti;
                        cmd.Parameters.Add("tipas", OracleType.VarChar).Value = tipas;
                        OracleParameter op = new OracleParameter("error_msg", OracleType.VarChar);
                        op.Direction = ParameterDirection.Output;
                        op.Size = 200;
                        cmd.Parameters.Add(op);

                    cmd.ExecuteNonQuery();
                    cmd.Parameters.RemoveAt(0);

程序并没有显示任何来自oracle的错误,插入并没有执行,我知道这一定是个例外。

过程或oracle代码中有什么错误?

C#显示Oracle过程中的自定义错误

您已经告诉存储过程,如果抛出任何异常,请向error_msg参数写入一条消息。

执行存储过程后检查该参数的值:

cmd.ExecuteNonQuery();
var errorMessage = Convert.ToString(cmd.Parameters["error_msg"].Value);

添加额外的out参数以向后端发送异常消息不是一个好主意

如果您想在try/catch块中看到异常消息,则必须使用RAISE_APPLICATION_ERROR。内置的RAISE_APPLICATION_ERROR仅用于一个场景:如果您需要将特定于应用程序的错误反馈给用户。

  RAISE_APPLICATION_ERROR (-20003, 'CUSTOM EXCEPTION MESSAGE');

并且它将在该语句中抛出完全相同的异常:

try
{
    cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
    string customMessage = ex.Message;
}  

更新

WHEN OTHERS THEN
  RAISE_APPLICATION_ERROR (-20003, 'CUSTOM EXCEPTION MESSAGE');