1

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

如何获得@rErrC# 中的值?

4

2 回答 2

1

访问输出参数有点尴尬;您需要以通常的方式将它们添加到参数集合中,使用 a .Directionof Output。然后你可以在执行该方法读取.Value参数对象的。但是:因此使用和处理它要容易得多。请注意,值可以以类似的方式完成,但使用适当的. 在这种情况下,你它都让它变得更加有趣......我只是个人使用这个部分。或者...抛出异常 ( )。selectreturn.Directionoutput returnoutputraiserrror

就像是:

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

您可以更轻松地获得类似的结果;这将导致Exception来自 ADO.NET 层的方向。

(请注意,您应该sysmessages在使用时正式添加自定义错误消息raiserror-throw不需要该步骤)

如果您使用throw(or raiserror) 方法并删除参数,则在Dapperoutput的帮助下,整段代码可能会变成:

conn.Execute("p1", new { name1 = "abc" }, commandType: CommandType.StoredProcedure);

容易做对!

于 2019-02-14T11:01:27.977 回答
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) 
于 2019-02-14T11:07:20.957 回答