查詢報表的時候需要通過兩次查詢取出數據。
第一次,用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 中發現了如下提問,真是如出一轍
代碼優化成了clone之后好了。
_ctx.Database.SqlQuery<ReceiveSummeryItem>(_sql, param.Select(x => ((ICloneable)x).Clone()).ToArray()).ToList();
搞定!