zoukankan      html  css  js  c++  java
  • 【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();

    搞定!

  • 相关阅读:
    js中this的用法
    js原型链与继承(初体验)
    关于C语言指针中的p++与p+i
    react todolist
    react表单提交
    react条件渲染
    react初体验
    初次接触express
    阿里内推在线编程题(返回元素的选择器)
    模块初始化
  • 原文地址:https://www.cnblogs.com/jhli/p/6898650.html
Copyright © 2011-2022 走看看