使用Dapper无法获取存储过程输出参数值的问题
Dapper调用存储过程无法获取正确输出参数值的问题
原生ADO.NET实现(可正常返回true)
using(connection= new SqlConnection(connectionString)) { using(var cmd = connection.CreateCommand()) { cmd.CommandText= query; cmd.CommandType= CommandType.StoredProcedure; cmd.CommandTimeout = commandTimeout; var pDeviceId = new SqlParameter { ParameterName = "@DeviceId", DbType = DbType.String, Size = 150, Direction = ParameterDirection.Input, Value = parameter.DeviceId }; cmd.Parameters.Add(pDeviceId); var pResponse = new SqlParameter { ParameterName = "@Response", DbType = DbType.Boolean, Direction = ParameterDirection.Output, }; cmd.Parameters.Add(pResponse); await connection.OpenAsync(); int i = cmd.ExecuteNonQuery(); var response = (bool)cmd.Parameters["@Response"].Value; return response; } }
Dapper错误实现(总是返回false)
using (connection = new SqlConnection(connectionString)) { using(var cmd = connection.CreateCommand()) { var parameters = new DynamicParameters(); parameters.Add("@DeviceId", parameter.DeviceId); parameters.Add("@Response", dbType: DbType.Boolean, direction: ParameterDirection.Output); var reply = (await connection.QueryAsync<bool>( query, param: parameters, commandType: System.Data.CommandType.StoredProcedure).ConfigureAwait(false)).FirstOrDefault(); return reply; } }
正确的Dapper实现
问题出在你误用了QueryAsync<bool>——这个方法是用来读取存储过程返回的结果集,而非输出参数。要获取输出参数的值,需执行完成后从DynamicParameters中提取,同时用ExecuteAsync代替QueryAsync(因为该存储过程没有返回结果集):
using (var connection = new SqlConnection(connectionString)) { var parameters = new DynamicParameters(); parameters.Add("@DeviceId", parameter.DeviceId); parameters.Add("@Response", dbType: DbType.Boolean, direction: ParameterDirection.Output); await connection.ExecuteAsync( query, param: parameters, commandType: CommandType.StoredProcedure).ConfigureAwait(false); var reply = parameters.Get<bool>("@Response"); return reply; }
核心修正点:
- 移除不必要的
SqlCommand创建,Dapper会自动处理命令对象 - 用
ExecuteAsync执行存储过程:适合无结果集、仅需执行操作或获取输出参数的场景 - 通过
parameters.Get<bool>("@Response")从动态参数中提取输出值
内容的提问来源于stack exchange,提问作者Ibanez1408
相关产品推荐
相关产品推荐

