【问题标题】:Dapper Dynamic Parameter wirth optional return value asp.net mvcDapper 动态参数 wirth 可选返回值 asp.net mvc
【发布时间】: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&lt;int&gt;("@SP_ID"));行上,我得到SP_ID作为output parameter,而在某些程序中我没有得到SP_ID作为output parameter

但问题是当我没有返回 SP_ID 作为输出参数时,我收到错误

字典中不存在给定的键。

我想在执行 p.get&lt;int&gt;() 之前检查密钥

我怎样才能做到这一点?

【问题讨论】:

  • 嗯;这很奇怪 - 你可以尝试设置 p.RemoveUnused = false; 吗?虽然我不认为这应该适用于存储过程,所以:我很想知道这是否有帮助;还有 - 还有其他共享DynamicParameters 的实例吗? (只是想知道这是否可能是并发问题)
  • 我想我没能让你理解这个问题……
  • 好吧,也许吧,但据我所知:你无条件地添加了 SP_MESSAGE 参数,所以我希望它在调用后仍然存在; Dapper 本身不会引发该消息,所以我必须假设它不再在内部字典中......(仅供参考:我写了 Dapper)
  • response.Ref1 = Convert.ToString(dp.Get&lt;int&gt;("@SP_ID")); 我想添加一个条件来检查我的动态参数中是否有 SP_ID 作为输出参数
  • 哦,SP_ID——那我确实看错了;奇怪的是我们没有添加 ContainsKey 或类似的 - 这是一个失败:我应该修复它。现在,我想你需要自己跟踪它:(

标签: asp.net-mvc dapper dynamicparameters


【解决方案1】:

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

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

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;
}

【讨论】:

    猜你喜欢
    • 2018-12-16
    • 1970-01-01
    • 2010-12-14
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多