sql 數據的分頁 自稱完美的實現

數據的分頁 留下該函數,朋友們看懂應該沒什麼問題,如果有疑問留言,會在第一時間內幫你解決。註釋的部分在速度和版本上都會有問題,沒有註釋的sql 是通用的,最起碼在sql server  系列上是通用的。請大家拍磚我的 數據的分頁 

        /// <summary>
        /// 數據的分頁  分頁WithCommand
        /// </summary>
        /// <param name="cmd">執行命令 該命令必須指定了SQL語句</param>
        /// <param name="PageIndex">頁數</param>
        /// <param name="PageSize">頁大小</param>
        /// <param name="OrderBy">排序字段 比如 : ID DESC </param> 
        /// <param name="TotalCount">返回總記錄數</param>
        /// <returns>datatable</returns>
        public static DataTable PagerWithCommand(SqlCommand cmd, int PageIndex, int PageSize, string OrderBy, ref int TotalCount)
        {
            //變量定義
            StringBuilder sbSql = new StringBuilder();
            //第一頁時
            if (PageIndex == 1)
            {
                sbSql.Append("SELECT TOP " + PageSize + " *  FROM (" + cmd.CommandText + ") as tempTable Order by " + OrderBy + ";");
            }
            else
            {
                // sql 2005  數據的分頁 版本以上纔可以用
                //  sbSql.Append("SELECT TOP " + PageSize * PageIndex + " *  FROM (" + cmd.CommandText + ") AS tempTable except select top " + PageSize * (PageIndex - 1) + " * from (" + cmd.CommandText + ") AS  tempTable Order by " + OrderBy + ";");

                // sql 2005 數據的分頁  以上才能使用,使用row_number() 速度比較慢
                 //sbSql.AppendLine(" select * from                                             ");
                 //sbSql.AppendLine("  (select row_number() over (order by  "+ OrderBy +" ) as RowID, *");
                 //sbSql.AppendLine("   from  (" + cmd.CommandText + ") as bb ) as aa ");
                 //sbSql.AppendLine("  where  aa.RowID between " + (PageIndex - 1) * PageSize + "  and " + PageIndex *PageSize + ";");

                // sql 2000 數據的分頁  版本以上均可  適合數據量比較小
                //sbSql.AppendLine(@" select   identity(int,   1,   1)   as   id_PageRowID,   *   into   #tmpPageTable   from   ( "
                //                   +   cmd.CommandText   +  ")   table_TempPage   ;");
                //sbSql.AppendLine(@"select   top   " +   PageSize   +   "   *   from   #tmpPageTable   where   id_PageRowID   between    "
                //                   + (PageIndex - 1) * PageSize  +     "+ 1  and    " + PageIndex * (PageSize ) + "  ;");
                //sbSql.AppendLine(@" drop   table   #tmpPageTable;");

                // sql 2000 版本以上  使用排序
                sbSql.AppendLine(" select * from                                             ");
                sbSql.AppendLine(" (select top " + PageSize + " *  from                      ");
                sbSql.AppendLine(" (select top " + PageIndex * (PageSize) + "  *  ");
                sbSql.AppendLine(" from (  " + cmd.CommandText + "  ) a  order by " + OrderBy + ")b  order by " + GetReverseOrder(OrderBy) + ") c ");
                sbSql.AppendLine(" order by " + OrderBy + " ");
            }

            sbSql.Append(" SELECT @TotalRecord = count(*) FROM (" + cmd.CommandText + ") tempTable");

            //重新設置命令SQL語句
            cmd.CommandText = sbSql.ToString();

            //總記錄數
            SqlParameter param  = new SqlParameter("@TotalRecord", SqlDbType.Int);
            param.Direction = ParameterDirection.Output;
            cmd.Parameters.Add(param);

            DataTable dtTemp = ExecuteSearch(cmd);

            TotalCount = (int)cmd.Parameters["@TotalRecord"].Value;

            return dtTemp;
        }

        /// <summary>
        /// 獲得反序 .
        /// </summary>
        /// <param name="orderBy">排序字段.</param>
        /// <returns>獲得反序的排序字段</returns>
        static string GetReverseOrder(string orderBy)
        {
            orderBy = orderBy.ToLower();
            if (orderBy.Contains(" asc"))
            {
                orderBy = orderBy.Replace(" asc", " desc");
            }
            else if (orderBy.Contains(" desc"))
            {
                orderBy = orderBy.Replace(" desc", " asc");
            }
            else
            {
                orderBy = orderBy + " desc";
            }

            return orderBy;
        }

上述分頁存在一些問題,當查詢到最後一頁時,不管最後一頁數據夠不夠PageSize條記錄,那麼查詢出的數據總是PageSize條記錄,不合理是吧。那麼修訂的方案如下:

 /// <summary>
        /// 分頁WithCommand
        /// </summary>
        /// <param name="cmd">執行命令 該命令必須指定了SQL語句</param>
        /// <param name="PageIndex">頁數</param>
        /// <param name="PageSize">頁大小</param>
        /// <param name="OrderBy">排序字段 比如 : ID DESC </param> 
        /// <param name="TotalCount">返回總記錄數</param>
        /// <returns>datatable</returns>
        public static DataTable PagerWithCommand(SqlCommand cmd, int PageIndex, int PageSize, string OrderBy, ref int TotalCount)
        {
            //變量定義
            StringBuilder sbSql = new StringBuilder();

            // 先計算總記錄數
          sbSql.AppendLine(" SELECT @TotalRecord = count(*) FROM (" + cmd.CommandText + ") tempTable ;");

            //第一頁時
            if (PageIndex == 1)
            {
                sbSql.Append(" SELECT TOP (@PageSize) *  FROM (" + cmd.CommandText + ") as tempTable Order by " + OrderBy + ";");
            }
            else
            {
                // sql 2005 版本以上纔可以用
                //  sbSql.Append("SELECT TOP " + PageSize * PageIndex + " *  FROM (" + cmd.CommandText + ") AS tempTable except select top " + PageSize * (PageIndex - 1) + " * from (" + cmd.CommandText + ") AS  tempTable Order by " + OrderBy + ";");

                // sql 2000 版本以上均可  適合數據量比較小
                //sbSql.AppendLine(@" select   identity(int,   1,   1)   as   id_PageRowID,   *   into   #tmpPageTable   from   ( "
                //                   +   cmd.CommandText   +  ")   table_TempPage   ;");
                //sbSql.AppendLine(@"select   top   " +   PageSize   +   "   *   from   #tmpPageTable   where   id_PageRowID   between    "
                //                   + (PageIndex - 1) * PageSize  +     "+ 1  and    " + PageIndex * (PageSize ) + "  ;");
                //sbSql.AppendLine(@" drop   table   #tmpPageTable;");

                // sql 2000 版本以上  使用排序
                sbSql.AppendLine(" select * from                                             ");

                // 如果是最後一頁數據條數 小於pagesize,那麼只選擇 實際數據的記錄數
                sbSql.AppendLine(" (select top (case when @TotalRecord < @PageIndex*@PageSize then @TotalRecord - (@PageIndex-1)*@PageSize  else @PageSize end) *  from          ");
                sbSql.AppendLine(" (select top (@PageIndex*@PageSize)  *  ");
                sbSql.AppendLine(" from (  " + cmd.CommandText + "  ) a  order by " + OrderBy + ")b  order by " + GetReverseOrder(OrderBy) + ") c ");
                sbSql.AppendLine(" order by " + OrderBy + " ");
            }

            //重新設置命令SQL語句
            cmd.CommandText = sbSql.ToString();

            /* 將分頁參數追加至SqlParameter */

            //當前頁
            SqlParameter param = new SqlParameter("@PageIndex", SqlDbType.Int);
            param.Value = PageIndex;
            cmd.Parameters.Add(param);

            //每頁顯示數
            param = new SqlParameter("@PageSize", SqlDbType.Int);
            param.Value = PageSize;
            cmd.Parameters.Add(param);

            //總記錄數
            param = new SqlParameter("@TotalRecord", SqlDbType.Int);
            param.Direction = ParameterDirection.Output;
            cmd.Parameters.Add(param);

            DataTable dtTemp = ExecuteSearch(cmd);

            TotalCount = (int)cmd.Parameters["@TotalRecord"].Value;

            return dtTemp;
        }

哈哈……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章