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