我如何在c#中获取@rErr /输出参数值?

时间:2019-02-14 10:59:13

标签: c# sql-server output-parameter

我创建一个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值?

2 个答案:

答案 0 :(得分:1)

访问输出参数有点尴尬;您需要以通常的方式将它们添加到参数集合中,并且.DirectionOutput。然后,在执行该方法之后,您可以读取参数对象.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)