[英]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
。 在這種情況下,您既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
方向。
(請注意,在使用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.