第一、首先在sqlserver中创建一个存储过程
USE [BZY] GO /****** 对象: StoredProcedure [dbo].[up_ProcCustomPage2005_New] 脚本日期: 12/24/2013 11:17:03 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: <Author,,Name> -- Create date: <Create Date,,> -- Description: <Description,,> -- ============================================= CREATE PROCEDURE [dbo].[up_ProcCustomPage2005_New] @SelectSql varchar(4000) ,@OrderBy varchar(4000) ,@PageSize int ,@PageIndex int ,@PageCount int output ,@RecordCount int output AS --SET @SelectSql = 'select * from table_3' --SET @OrderBy = 'order by id desc' Declare @sql nvarchar(4000) SET @sql = 'select @RecourdCount = count(*) from (' + @SelectSql + ') as tt@#$' EXEC sp_executesql @sql,N'@RecourdCount int OUTPUT',@RecordCount OUTPUT SET @PageCount = CEILING( (@RecordCount + 0.0) / @PageSize) IF @PageIndex > @PageCount SET @PageIndex = @PageCount IF @PageIndex < 1 SET @PageIndex = 1 DECLARE @StartIndex int DECLARE @EndIndex int SET @StartIndex = (@PageIndex-1) * @PageSize + 1 SET @EndIndex = @PageIndex * @PageSize SET @sql = 'select * from (select row_number()over(' + @OrderBy + ') as rownumber,* from (' + @SelectSql + ') AS tt@#$) as tt@#$result where rownumber between ' + cast(@StartIndex AS varchar) + ' and ' + cast(@EndIndex AS varchar) PRINT @sql EXEC sp_executesql @sql
二、c#代码:
private static DataTable GetExecuteCustomPage_New(string selectSql, string orderBy, int pageSize, int pageIndex, out int pageCount, out int recordCount) { MatchCollection mc = Regex.Matches(orderBy, @"([^ ]*)\.[^ ]*"); if (mc.Count > 0) { foreach (Match item in mc) { orderBy = orderBy.Replace(item.Groups[1].Value + ".", ""); } } SqlParameter SelectSql = new SqlParameter() { ParameterName = "@SelectSql", Size = 4000, Value = selectSql }; SqlParameter OrderBy = new SqlParameter() { ParameterName = "@OrderBy", Size = 4000, Value = orderBy }; SqlParameter PageSize = new SqlParameter() { ParameterName = "@PageSize", Size = 4, Value = pageSize , DbType = DbType.Int32 }; SqlParameter PageIndex = new SqlParameter() { ParameterName = "@PageIndex", Size = 4, Value = pageIndex , DbType = DbType.Int32 }; SqlParameter PageCount = new SqlParameter() { ParameterName = "@PageCount", Size = 4, Direction = ParameterDirection.Output , DbType = DbType.Int32 }; SqlParameter RecordCount = new SqlParameter() { ParameterName = "@RecordCount", Size = 4, Direction = ParameterDirection.Output , DbType = DbType.Int32 }; DataSet ds = new DataSet(); using (SqlConnection cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConfig"].ToString())) { SqlCommand cmd = cnn.CreateCommand(); cmd.CommandText = "up_ProcCustomPage2005_New"; cmd.CommandType = CommandType.StoredProcedure; cmd.Connection = cnn; cmd.Parameters.Add(SelectSql); cmd.Parameters.Add(OrderBy); cmd.Parameters.Add(PageSize); cmd.Parameters.Add(PageIndex); cmd.Parameters.Add(PageCount); cmd.Parameters.Add(RecordCount); SqlDataAdapter sda = new SqlDataAdapter(cmd); cnn.Open(); sda.Fill(ds); pageCount = Convert.ToInt32(PageCount.Value); recordCount = Convert.ToInt32(RecordCount.Value); } return ds.Tables[0]; }
三、引用例子
public DataSet GetPurchaserSalesVolumeAnalysis(string where, string sFilter_Condition, int iPage_Size, int iPage_Index, string sTaxisField, int iTaxis_Sign, out int iPageCount, out int iiRecord_Count) { string sql = @"select NewT.ptPaymentDate,NewT.fsStatus from Student NewT ";string orderwhere = " ORDER BY NewT.ptPaymentDate "; return BaitourDAO.Common.DBHelper.GetExecuteCustomPage_New( sql , orderwhere , iPage_Size , iPage_Index , out iPageCount , out iiRecord_Count); }