获取“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 命令时出错的主要内容,如果未能解决你的问题,请参考以下文章

java反射获取属性值

Shell 获取路径

iOS 获取文件大小

根据日期字符串获取星期几,日期获取星期,时间获取星期,js获取星期

js如何获取时间点?

iOS 获取设备的各种信息的方法