获取存储过程返回的值而不是受影响的行

时间:2017-10-20 14:30:03

标签: c# dapper

我有一个存储过程,它执行插入并返回插入的最后一行(例如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返回受影响的行数。

如何获取存储过程返回的StudentId?

1 个答案:

答案 0 :(得分:1)

使用Query,而不是Execute。执行适用于不返回值的查询。

Dapper存储库中的文档显示了如何调用返回结果的存储过程:

var user = cnn.Query<User>("spGetUser", new {Id = 1}, 
    commandType: CommandType.StoredProcedure).SingleOrDefault();

您也可以简化存储过程。 INSERT,DELETE和UPDATE有一个OUTPUT clause,可用于通过查询inserteddeleted虚拟表来返回原始值和替换值:

 insert into ... 
 OUTPUT inserted.StudentID
 values...

您的代码可以简化为:

  int studentId = connection.Query<int>("insertStudent", parameters, commandType : CommandType.StoredProcedure)
                            .SingleOrDefault();