获取“SqlParameter 已被另一个 SqlParameterCollection 包含。”使用 SqlQuery 命令时出错
Posted
技术标签:
【中文标题】获取“SqlParameter 已被另一个 SqlParameterCollection 包含。”使用 SqlQuery 命令时出错【英文标题】:Getting "The SqlParameter is already contained by another SqlParameterCollection." error while using SqlQuery command 【发布时间】:2015-06-01 14:01:17 【问题描述】:我正在尝试参数化动态查询并首先在实体框架代码中使用 SqlQuery 方法运行它。
我第一次执行 SqlQuery 时,它按预期工作,所以我确信查询或参数没有任何问题,但是我立即使用相同的参数第二次执行相同的命令,我得到了这个错误
“SqlParameter 已被另一个 SqlParameterCollection 包含。”
由于我已经在这里使用ToList()
方法,我不知道可能是什么原因!
这是模拟代码。
using (var context = Common.GetDbContext())
var parameters = new List<SqlParameter>();
//populating parameters here...
var sqlQuery = "Select * from MyTable where UserId=@p1 and And Active=@p2";
// first time
var result = context.Database.SqlQuery<ResultType>(sqlQuery, parameters.ToArray()).ToList();
//second time
result = context.Database.SqlQuery<ResultType>(sqlQuery, parameters.ToArray()).ToList();
有什么想法吗?
【问题讨论】:
你必须为每个查询创建一个新的 SqlParameter 实例 【参考方案1】:嗨,SqlParameter 是可克隆的。试试这个:
result = context.Database.SqlQuery<ResultType>(sqlQuery, parameters.Select(x => x.Clone()).ToArray()).ToList();
见https://msdn.microsoft.com/en-us/library/vstudio/bb338957%28v=vs.100%29.aspx
【讨论】:
谢谢!不知道为什么 Visual Studio 无法识别 x.Clone() 方法。所以我把它改成了 Select(x => ((ICloneable)x).Clone()).ToArray()).ToList() 它就像一个魅力。以上是关于获取“SqlParameter 已被另一个 SqlParameterCollection 包含。”使用 SqlQuery 命令时出错的主要内容,如果未能解决你的问题,请参考以下文章