【发布时间】:2023-02-01 16:52:54
【问题描述】:
您好,我有一个常见的功能,如下所示,
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>()之前检查密钥我怎样才能做到这一点?
【问题讨论】:
-
嗯;这很奇怪 - 你可以尝试设置
p.RemoveUnused = false;吗?虽然我不认为这应该适用于存储过程,所以:我很想知道这是否有帮助;还有 - 还有其他共享DynamicParameters的实例吗? (只是想知道这是否可能是并发问题) -
我想我没能让你理解这个问题……
-
好吧,也许吧,但据我所知:你无条件地添加了
SP_MESSAGE参数,所以我希望它在调用后仍然存在; Dapper 本身不会引发该消息,所以我必须假设它不再在内部字典中......(仅供参考:我写了 Dapper) -
response.Ref1 = Convert.ToString(dp.Get<int>("@SP_ID"));我想添加一个条件来检查我的动态参数中是否有 SP_ID 作为输出参数 -
哦,SP_ID——那我确实看错了;奇怪的是我们没有添加
ContainsKey或类似的 - 这是一个失败:我应该修复它。现在,我想你需要自己跟踪它:(
标签: asp.net-mvc dapper dynamicparameters