C# Web API 使用 Dapper 使用存储过程插入数据 - 无法获取插入的记录 ID
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
我得到的输出显示最后插入的行的值。
但是当从 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
上的OUTPUT
SQL子句)就可以读取结果了,完全没有输出参数。
由于您的存储过程还选择 输出:
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
我是 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
上的OUTPUT
SQL子句)就可以读取结果了,完全没有输出参数。
由于您的存储过程还选择 输出:
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