數據的分頁 留下該函數,朋友們看懂應該沒什麼問題,如果有疑問留言,會在第一時間內幫你解決。註釋的部分在速度和版本上都會有問題,沒有註釋的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;
}
哈哈……