【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();

搞定!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM