【EF框架】另一个 SqlParameterCollection 中已包含 SqlParameter。

查询报表的时候需要通过两次查询取出数据。

第一次,用count(*)查出总数;

第二次,用rownumber分页取出想要的页内容;

为了防止sql注入,使用SqlParameter来传递参数

                var param = new List<SqlParameter>();
                param.Add(new SqlParameter("@StartTime", DateTime.Parse(req.StartTime)));
                param.Add(new SqlParameter("@EndTime", DateTime.Parse(req.EndTime)));

1

_ctx.Database.SqlQuery<int>(_sql, param.ToArray()).FirstOrDefault();

2

_ctx.Database.SqlQuery<ReceiveSummeryItem>(_sql, param.ToArray()).ToList();

但是第二次竟然报错:

另一个 SqlParameterCollection 中已包含 SqlParameter。

百度出来的一大堆结果都是给出的如下解决方案,然并卵

复制代码
       SqlCommand cmd = new SqlCommand();
            using (SqlConnection conn = new SqlConnection(connDBStr))
            {
                PrepareSqlCommand(cmd, conn, null, sql, cmdParms);
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                DataTable dt = new DataTable    (SetSqlAsDataTableName(sql));
                da.Fill(dt);
                cmd.Parameters.Clear();//多了这一句,就解决了问题
                return dt;
            }
复制代码

浪费感情。。。

只好用google搜索

最后在 stackoverflow 中发现了如下提问,真是如出一辙

https://stackoverflow.com/questions/30575555/getting-the-sqlparameter-is-already-contained-by-another-sqlparametercollection

 

代码优化成了clone之后好了。

_ctx.Database.SqlQuery<ReceiveSummeryItem>(_sql, param.Select(x => ((ICloneable)x).Clone()).ToArray()).ToList();

搞定!

 

posted @   0539  阅读(7656)  评论(8编辑  收藏  举报
编辑推荐:
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
阅读排行:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 用 C# 插值字符串处理器写一个 sscanf
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
点击右上角即可分享
微信分享提示