簡體   English   中英

如何在 c# 中獲取 @rErr / 輸出參數值?

[英]How can i get @rErr / Output Parameter value in c#?

我創建了一個 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值?

訪問輸出參數有點笨拙; 您需要以通常的方式將它們添加到參數集合中,並帶有.Direction of Output 然后就可以執行該方法讀取參數對象的.Value 但是:使用select並因此處理它要容易得多。 請注意, return值可以以類似的方式完成,但使用適當的.Direction 在這種情況下,您既outputreturn它的事實使它變得更加有趣......我個人只使用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方向。

(請注意,在使用raiserror時,您應該將自定義錯誤消息正式添加到sysmessages - throw不需要該步驟)

如果您使用throw (或raiserror )方法,並刪除output參數,在Dapper 的一些幫助下,整段代碼可能會變成:

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

這是一個更容易得到正確的!

您不需要單個插入的事務,您可以像下面這樣重構您的 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) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM