[英]C# Web API using Dapper to insert data using a stored procedure - unable to get inserted record Id
我是 Dapper 的新手-請幫助我。 插入成功后如何獲取插入的記錄值?
存儲過程:
ALTER PROCEDURE Sp_InsertTestData
@Name varchar(50),
@gender int,
@refres int OUTPUT
AS
BEGIN
INSERT INTO Test_Master (Name, Gender)
VALUES (@Name, @gender);
SELECT @refres = SCOPE_IDENTITY()
SELECT @refres as M_SID
END
當我像這樣在 SQL 中執行這個存儲過程時:
DECLARE @refres INT
EXEC Sp_InsertTestData 'test12',1,@refres
我得到一個 output 顯示最后插入的行的值。
但是當這個存儲過程從 C# 代碼執行時,每次我得到一個值 1:
using (SqlConnection con = new SqlConnection(_configuration.GetConnectionString("DatabaseConnection")))
{
con.Open();
SqlTransaction sqltrans = con.BeginTransaction();
var param = new DynamicParameters();
param.Add("@Name", Bindtestmaster.Name);
param.Add("@gender", Bindtestmaster.Gender);
param.Add("@refres");
res = con.Execute("Sp_InsertTestData", param, sqltrans, 0, CommandType.StoredProcedure);
}
那是因為您獲得了存儲過程調用的結果,它告訴您插入的行數(即 1)。
您想閱讀 output 參數@refres
(並將其作為 output 參數添加到您的DynamicParameters
中)
/* ... */
param.Add("@refres", dbType: DbType.Int32, direction: ParameterDirection.Output);
con.Execute("Sp_InsertTestData", param, sqltrans,0,CommandType.StoredProcedure);
var yourId = param.Get<int>("@refres");
順便說一句,在您的存儲過程上,而不是:
select @refres=SCOPE_IDENTITY()
您可能更喜歡這個:
SET @refres = SCOPE_IDENTITY() AS INT
而且我不確定最后一個SELECT
是干什么用的
Or directly output the inserted ID (using the OUTPUT
SQL clause on the INSERT
) and then you could read the result, and not have an output parameter at all.
由於您的存儲過程還選擇了 output:
select @refres as M_SID
一種更簡單的方法可能是:
var id = con.ExecuteScalar<int>("Sp_InsertTestData", new {
Name = Bindtestmaster.Name,
gender = Bindtestmaster.Gender
}, sqltrans, 0, CommandType.StoredProcedure);
並忘記DynamicParameters
等。您還可以考慮在 SQL 中使用OUTPUT
子句來簡化它:
ALTER PROCEDURE Sp_InsertTestData
@Name varchar(50), @gender int
AS
BEGIN
INSERT INTO Test_Master(Name, Gender)
OUTPUT INSERTED.Id -- whatever the column is here
VALUES (@Name, @gender);
END
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.