获取存储过程返回值而不是受影响的行
Getting stored procedure returned value instead of row affected
我有一个存储过程,它执行插入和插入的最后一行的 returns(例如 StudentID)。
create procedure insertStudent
@...
insert into ... values...
set @StudentId = scope_identity();
select StudentId from ... where StudentId = @StudentId
在代码中,我有
var sql = ...;
using(var connection = new SqlConnection(connectionString)
{
var parameters = new DynamicParameters();
parameters.Add ...;
...
int studentId = connection.Execute(sql, parameters, commandType : CommandType.StoredProcedure);
...
}
connection.Execute returns 受影响的行数。
如何获取存储过程返回的 StudentId?
使用 Query
,而不是 Execute
。执行适用于没有 return 值的查询。
Dapper 存储库中的文档展示了如何调用 returns 结果的存储过程:
var user = cnn.Query<User>("spGetUser", new {Id = 1},
commandType: CommandType.StoredProcedure).SingleOrDefault();
您也可以简化存储过程。 INSERT、DELETE 和 UPDATE 有一个 OUTPUT clause,可以通过查询 inserted
和 deleted
虚拟表用于 return 原始值和替换值:
insert into ...
OUTPUT inserted.StudentID
values...
您的代码可以简化为:
int studentId = connection.Query<int>("insertStudent", parameters, commandType : CommandType.StoredProcedure)
.SingleOrDefault();
我有一个存储过程,它执行插入和插入的最后一行的 returns(例如 StudentID)。
create procedure insertStudent
@...
insert into ... values...
set @StudentId = scope_identity();
select StudentId from ... where StudentId = @StudentId
在代码中,我有
var sql = ...;
using(var connection = new SqlConnection(connectionString)
{
var parameters = new DynamicParameters();
parameters.Add ...;
...
int studentId = connection.Execute(sql, parameters, commandType : CommandType.StoredProcedure);
...
}
connection.Execute returns 受影响的行数。
如何获取存储过程返回的 StudentId?
使用 Query
,而不是 Execute
。执行适用于没有 return 值的查询。
Dapper 存储库中的文档展示了如何调用 returns 结果的存储过程:
var user = cnn.Query<User>("spGetUser", new {Id = 1},
commandType: CommandType.StoredProcedure).SingleOrDefault();
您也可以简化存储过程。 INSERT、DELETE 和 UPDATE 有一个 OUTPUT clause,可以通过查询 inserted
和 deleted
虚拟表用于 return 原始值和替换值:
insert into ...
OUTPUT inserted.StudentID
values...
您的代码可以简化为:
int studentId = connection.Query<int>("insertStudent", parameters, commandType : CommandType.StoredProcedure)
.SingleOrDefault();