Dapper 动态参数

问题描述

我正在使用 dapper 和 dynamicParameters 从 Web API 项目 (.NET 5) 中的 sql Server 获取数据。

它大部分时间都可以正常工作,但有时会出现以下错误

过程或函数 MySP 指定的参数过多。

我怀疑由于同时请求,参数重复。这个问题有解决办法吗?

string sp = "MySP";

if (ADOFunctions.IsConncetionReadyToOpen(Connection))
{
    await Connection.OpenAsync();
}

var queryParameters = new DynamicParameters();
queryParameters.Add("@Date",dateTime.Date);
queryParameters.Add("@ClientRef",clientRef);
queryParameters.Add("@orderRefs",orderRefList);

var countLimitation = await Connection.QueryAsync<UnityExhibitionordersInfo>
   (sql: sp,param: queryParameters,commandType: System.Data.CommandType.StoredProcedure);

foreach (var item in countLimitation)
{
    if (item.sold > item.Limit)
    {
        returnVal.Message += $"error ";
        returnVal.Result = false;
    }
}

解决方法

首先,应该注意的是,您甚至不需要 DynamicParameters 在这里;一个简单的:

new { dateTime.Date,ClientRef = clientRef,orderRefs = orderRefList }

对于参数来说应该绰绰有余,因为这是一个简单的用法,但是:无论哪种方式,您的 queryParameters 对象都是本地的而不是共享的(这很好)。这应该工作得很好 - 那么,我的怀疑是:“Connection 是否以某种方式在同一请求的请求/并发异步流之间共享?” (绝对不能;ADO.NET 连接不是线程安全的,也不适用于并发访问)。