Sql Dapper:过程或函数指定的参数太多

Sql Dapper:过程或函数指定的参数太多,sql,.net,sql-server,dapper,Sql,.net,Sql Server,Dapper,使用Dapper调用存储过程时,我收到以下错误: Procedure or function has too many arguments specified 我正在使用DynamicParameters向查询中添加一个简单参数列表 参数代码如下所示: var parameters = new DynamicParameters(); parameters.Add(p.Name, p.Value, direction: p.Mode); var result = _connection.Qu

使用Dapper调用存储过程时,我收到以下错误:

Procedure or function has too many arguments specified
我正在使用DynamicParameters向查询中添加一个简单参数列表

参数代码如下所示:

var parameters = new DynamicParameters();
parameters.Add(p.Name, p.Value, direction: p.Mode);
var result = _connection.Query<T>(
            string.Format("{0}.{1}", request.SchemaName, request.StoredProcedureName),
            parameters,
            commandType: CommandType.StoredProcedure,
            transaction: _transaction);
查询代码如下所示:

var parameters = new DynamicParameters();
parameters.Add(p.Name, p.Value, direction: p.Mode);
var result = _connection.Query<T>(
            string.Format("{0}.{1}", request.SchemaName, request.StoredProcedureName),
            parameters,
            commandType: CommandType.StoredProcedure,
            transaction: _transaction);
@ParameterNames1根本不是参数的调用方式。实际上,名称是作为值(N'ParameterName')传入的。@RemoveUnused参数在我看来完全是随机的,因为它根本不会出现在调用代码中

完整的代码可以在这里找到:第61行和第228行


编辑:我发现问题是由于使用不同的结果集调用同一过程两次造成的。所以我第一次用Query调用它,第二次用Query调用它。为什么Dapper在这种情况下会遇到麻烦仍然是个谜。

我无法重现这一点:

public void SO25069578_DynamicParams_Procs()
{
    var parameters = new DynamicParameters();
    parameters.Add("foo", "bar");
    try { connection.Execute("drop proc SO25069578"); } catch { }
    connection.Execute("create proc SO25069578 @foo nvarchar(max) as select @foo as [X]");
    var tran = connection.BeginTransaction(); // gist used transaction; behaves the same either way, though
    var row = connection.Query<HazX>("SO25069578", parameters,
        commandType: CommandType.StoredProcedure, transaction: tran).Single();
    tran.Rollback();
    row.X.IsEqualTo("bar");
}
public class HazX
{
    public string X { get; set; }
}

不过,这也很好。您是否可能正在使用非常非常旧的dapper版本?您使用的是什么版本?

我最近遇到了这个问题,这似乎是由以下原因造成的:

exec dbo.storedProcedureName @ParameterNames1=N'ParameterName',@ParameterNames2=N'ParameterName',@RemoveUnused=1
  • 存储过程可以返回多个数据集(可能基于 条件参数)
  • 您正在使用调用存储过程
    Query()
    而不是
    QueryMultiple()
    然后映射数据集 通过
    读取
我们最近从Dapper的旧版本升级到v1.4,以支持表变量参数,我们开始体验这种行为,这是升级的直接结果

解决方案:


将基于
Query
的代码转换为
QueryMultiple
实现。

我意识到这是一个旧线程。但是,我使用的是最新版本的Nuget软件包(1.60.6),最近遇到了这个问题

为了重现这种情况,您需要一个基于输入参数的存储过程,它可以返回1或2(多于1)个resultset。在代码中,我也使用了两种不同的扩展方法来调用它(
QueryMultipleAsync
将参数设置为1或true,而
QueryAsync
将其设置为0或false)。如果测试最终调用SP以首先返回多个resultset,则需要1个resultset的后续调用将失败,并出现此错误

我解决这个问题的唯一方法是将SP分解为2个,使它们具有不同的名称

以下是我如何称呼SP以供参考:

var data = await sqlConnection.QueryAsync<T>(
             StoredProcedureName,
             parms,
             transaction: null,
             commandTimeout: null,
             commandType: CommandType.StoredProcedure)
var data=await-sqlConnection.QueryAsync(
存储的过程烯胺,
帕尔姆斯,
事务:空,
commandTimeout:null,
commandType:commandType.StoredProcess)

var data=await-sqlConnection.QueryMultipleAsync(
存储的过程烯胺,
参数:p,
commandType:commandType.StoredProcess)
.地图
(
o1=>o1.Id,
o2=>o2.FkId±0,
(o1,o2)=>{o1.Children=o2.ToList();}
);

最近遇到了这个问题,原因是使用不同的简洁方法调用同一过程两次。

对同一SQL存储过程的第一个调用是via.QueryMultiple。使用.QuerySingleOrDefault再次调用带有参数的相同过程会导致参数为原始问题中提到的ParameterNames1和RemoveUnused。

您的代码似乎正确。现在,正如错误所说,您已经传递了一些未在SP中定义的额外参数。因此,请检查您配置要传递的参数的代码。@Krishnajrana:谢谢您的评论。就我所见,我没有传递额外的参数。我已经编辑了这个问题,因为我发现了一些附加信息。如果您的SP返回多个结果,那么您可以使用dapper的QueryMultiple()。与其两次调用同一个SP,不如编写SP代码,使其在SP中执行第一个结果,然后将其用于第二个结果,然后根据您的要求返回这两个结果集。这似乎是一个真正特定的错误。我使用的是NuGet版本,它是1.27,因为最新版本昨天发布了。我会深入研究这一点,看看能不能找到一个解释。