我创建一个SQL存储过程
create proc p1
(
@name1 nvarchar(50),
@rErr int OUTPUT
)
as
begin Transaction
insert into test (name1)
values (@name1)
if @name1 = 'n100'
Begin
Rollback Transaction
Set @rErr=50001
Return @rErr
End
commit Transaction
如何在C#中获取@rErr
值?
答案 0 :(得分:1)
访问输出参数有点尴尬;您需要以通常的方式将它们添加到参数集合中,并且.Direction
为Output
。然后,在执行该方法之后,您可以读取参数对象的.Value
。但是:使用select
并对其进行处理要容易得多。请注意,return
值可以以类似的方式完成,但要使用适当的.Direction
。在这种情况下,您同时output
和 return
都使它变得更加有趣……我只需要使用output
部分,亲自。或者...引发异常(raiserrror
)。
类似的东西:
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "p1";
cmd.CommandType = CommandType.StoredProcedure;
var name = cmd.CreateParameter();
name.ParameterName = "@name1";
name.Value = "abc"; // etc
cmd.Parameters.Add(name);
var err = cmd.CreateParameter();
err.ParameterName = "@rErr";
err.Direction = ParameterDirection.Output;
cmd.Parameters.Add(err);
cmd.ExecuteNonQuery();
if (err.Value is int i)
{
// error i happened
}
}
但是:如果您刚使用过:
raiserror (50001, 16, 1) -- severity needs to be at least 16 here; typically = 16
或(在最新的SQL Server版本中):
throw 50001, 'oops', 1
您可以轻松获得相似的结果;这将导致从ADO.NET层向Exception
方向发展。
(请注意,使用sysmessages
时,您应该将自定义错误消息正式添加到raiserror
-throw
不需要该步骤)
如果您使用throw
(或raiserror
)方法,并删除了output
参数,那么在Dapper的帮助下,整个代码段可能会变成:
conn.Execute("p1", new { name1 = "abc" }, commandType: CommandType.StoredProcedure);
这是很多更容易解决的问题!
答案 1 :(得分:0)
您不需要一次插入交易,就可以像下面这样重构您的SP。要将代码作为输出参数返回,只需使用RETURN(50001)
CREATE PROC P1 (@name1 NVARCHAR(50),
@rErr INT output)
AS
IF @name1 <> 'n100'
BEGIN
INSERT INTO test(name1)
VALUES (@name1)
RETURN(0)
END
RETURN(50001)