带可选返回值的动态参数



你好,我有一个常见的函数,如下所示,

public async Task<SPResponse> ExecuteAsync(string spName, DynamicParameters p)
{
SPResponse response = new SPResponse();
using (SqlConnection conn = new SqlConnection(_connStr))
{
conn.Open();
using (SqlTransaction transaction = conn.BeginTransaction(IsolationLevel.ReadCommitted))
{
try
{
p.Add("@SP_MESSAGE", dbType: DbType.String, direction: ParameterDirection.Output, size: 4000);
p.Add("@RETURNSTATUS", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);
await conn.ExecuteAsync(sql: spName, param: p, commandType: CommandType.StoredProcedure, transaction: transaction);
response.ReturnMessage = p.Get<string>("@SP_MESSAGE");
response.ReturnStatus = Convert.ToString(p.Get<int>("@RETURNSTATUS"));
if (response.ReturnStatus == "0")
{
response.Ref1 = Convert.ToString(p.Get<int>("@SP_ID"));
transaction.Commit();
}
else
{
transaction.Rollback();
}
}
catch (Exception ex)
{
Utils.Logger.Instance.LogException(ex);
transaction.Rollback();
}
conn.Close();
}
}
return response;
}

现在在response.Ref1 = Convert.ToString(p.Get<int>("@SP_ID"));行在我的一些程序中,我将SP_ID作为output parameter而在某些程序中,我没有将SP_ID作为output parameter

但问题是,当我不返回SP_ID作为输出参数,我得到错误的

给定的键在字典中不存在。

我想在执行p.get<int>()之前检查密钥

我该怎么做?

所以我自己修复了这个问题,感谢@MarcGravell。

我在使用ExecuteAsync方法的DapperClass中声明了一个参数。

private DynamicParameters _Param;
public DapperClass()
{
_Param = new DynamicParameters();
}

现在在transaction.Commit()行之前,我将值赋给参数_Param = p;

和我创建了一个返回类型为DynamicParameters的公共方法,如下

public DynamicParameters GetDynamicParameters()
{
return _Param;
}

,还添加了如下代码,从我执行我的公共dapper类

SPResponse response = await _Dapper.ExecuteAsync("[dbo].[TemplateAdd]", _DynamicParameter);
if (response.ReturnStatus == "0")
{
DynamicParameters dp = _Dapper.GetDynamicParameters();
response.Ref1 = Convert.ToString(dp.Get<int>("@SP_ID"));
response.Ref2 = request.FileServerId;
}