C# Dapper存储过程在向其传递IEnumerable时指定了太多参数

C# Dapper存储过程在向其传递IEnumerable时指定了太多参数,c#,sql,dapper,C#,Sql,Dapper,我通过以下方法调用我的过程: public async Task<IEnumerable<Algorithm>> GetAlgorithmsByNameAsync(IEnumerable<string> names) { var parameters = new DynamicParameters(); parameters.Add("@names", names); var connection = _connection.GetO

我通过以下方法调用我的过程:

public async Task<IEnumerable<Algorithm>> GetAlgorithmsByNameAsync(IEnumerable<string> names)
{
    var parameters = new DynamicParameters();
    parameters.Add("@names", names);

    var connection = _connection.GetOpenConnection();   
    return await connection.QueryAsync<Algorithm>("GetAlgorithmsByName", parameters, commandType: CommandType.StoredProcedure);
}
从上面的代码中,我得到一个错误:

“过程或函数GetAlgorithmsByName指定的参数太多。”


我做错了什么?如何使用dapper将
IEnumerable
传递给存储过程?

在您的存储过程中,它期望
[Item][NVARCHAR](MAX)
,它表示一个项,而您传递的是
IEnumerable名称。这就是为什么你会出错的原因

有许多方法可以将字符串列表传递给sp

  • XML
  • 使用like
    创建类型NameList作为表(Name Varchar(100))
  • 使用
    names=“Name1,Name2,…,Namen”然后使用sql获取名称列表

  • 已更新 您传递的参数不正确,让我们通过这种方式修复它

         using (var table = new DataTable()) 
         {
          table.Columns.Add("Item", typeof(string));
    
          for (int i = 0; i < names.length; i++)
            table.Rows.Add(i.ToString());
    
          var pList = new SqlParameter("@names", SqlDbType.Structured);
          pList.TypeName = "dbo.StringList";
          pList.Value = table;
    
          parameters.Add(pList);
       }
    
    使用(var table=new DataTable())
    {
    表.列.添加(“项目”,类型(字符串));
    for(int i=0;i
    表值参数使用起来并不简单;一种方法是通过Dapper在
    DataTable
    上添加的扩展方法(类似于
    AsTableValuedParameter
    ),但是:它不像
    IEnumerable
    那样简单——至少今天不是这样。在这里,您可能也不需要
    动态参数


    如果您想要的只是一组字符串,那么一个非常实用的选项是查看SQL Server中内置的
    string\u split
    API,前提是您可以定义一个从未在数据中使用的分隔符标记。然后您可以只传递一个分隔字符串。

    您可以使用IEnumerable(动态)而不是IEnumerable(字符串)


    检查此链接并尝试

    您的第二个选项是OP在问题中的内容OOPS,对不起,我的问题。让我更新我的答案。谢谢,先生。我刚刚更新了我的答案,请看一下@Marc Gravell♦ 然而,在我看来,参数非常简单,OP不需要创建
    表值参数
    ,应该使用选项3。最后的代码似乎忽略了这样一个事实,即OP使用的是dapper,而不是原始ADO.NET;数据表位看起来不错,但是有一个扩展方法-类似于一个TableValuedParameter,它与DapperThanks一起使用,供您参考!当我回到我的项目时,我会很快检查一切:)
         using (var table = new DataTable()) 
         {
          table.Columns.Add("Item", typeof(string));
    
          for (int i = 0; i < names.length; i++)
            table.Rows.Add(i.ToString());
    
          var pList = new SqlParameter("@names", SqlDbType.Structured);
          pList.TypeName = "dbo.StringList";
          pList.Value = table;
    
          parameters.Add(pList);
       }