C#Web API使用Dapper使用存储过程插入数据-无法获取插入的记录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

我得到的输出显示了最后插入的行的值。

但是当这个存储过程从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(。

您想要读取输出参数@refres(并将其作为输出参数添加到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是什么

或者直接输出插入的ID(使用INSERT上的OUTPUTSQL子句(,然后可以读取结果,而根本没有输出参数。

由于存储过程也选择输出:

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