你好,我有一个常见的函数,如下所示,
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;
}