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代码中有什么错误?
您已经告诉存储过程,如果抛出任何异常,请向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');