【问题标题】:Getting "The SqlParameter is already contained by another SqlParameterCollection." error while using SqlQuery command获取“SqlParameter 已被另一个 SqlParameterCollection 包含。”使用 SqlQuery 命令时出错
【发布时间】: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 实例

标签: entity-framework code-first


【解决方案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() 它就像一个魅力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 2011-09-11
  • 2012-06-14
相关资源
最近更新 更多