zoukankan      html  css  js  c++  java
  • 最近项目使用的SqLServer分页存储过程及调用封装代码

    存储过程:

    USE [RS]
    GO
    
    /****** Object:  StoredProcedure [dbo].[UP_Paging]    Script Date: 05/30/2013 17:43:23 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    
    ALTER PROCEDURE [dbo].[UP_Paging]
    	@Tables nvarchar(512), --表名,多张表是请使用 tA a inner join tB b On a.AID = b.AID
    	@PK nvarchar(128)='',    --主键,可以带表头 a.AID
    	@Sort nvarchar(512) = '', --排序字段
    	@PageIndex int = 1,    --开始页码
    	@PageSize int = 10,        --页大小
    	@Fields nvarchar(1024) = '*',--读取字段
    	@Where nvarchar(1024) = NULL,--Where条件
    	@RecordCount int output --返回总条数
    AS
    
    DECLARE @strFilter nvarchar(4000)
    declare @sql nvarchar(4000)
    IF @Where IS NOT NULL AND @Where != ''
      BEGIN
       SET @strFilter = ' WHERE ' + @Where + ' '
      END
    ELSE
      BEGIN
       SET @strFilter = ''
      END
    
    if @Sort = ''
      set @Sort = @PK + ' DESC '
    
    IF @PageIndex < 1
      SET @PageIndex = 1
    
    if @PageIndex = 1 --第一页提高性能
    begin 
      set @sql = 'select top ' + str(@PageSize) +' '+@Fields+ '  from ' + @Tables + ' ' + @strFilter + ' ORDER BY  '+ @Sort
      print @sql
    end 
    else
      begin  
    	DECLARE @START_ID varchar(50)	--页开始索引
    	DECLARE @END_ID varchar(50)		--页结束索引
    	SET @START_ID = convert(varchar(50),(@PageIndex - 1) * @PageSize + 1)
    	SET @END_ID = convert(varchar(50),@PageIndex * @PageSize)
    	
    	set @sql =  ' SELECT '+@Fields+ 
    				' FROM '+
    				' ('+
    					' SELECT ROW_NUMBER() OVER(ORDER BY '+@Sort+') AS rownum, '+@Fields+ 
    					' FROM '+@Tables+' ' +@strFilter+
    				' ) AS D'+
    				' WHERE rownum BETWEEN '+@START_ID+' AND ' +@END_ID +' ORDER BY '+@Sort
      END
    
    EXEC (@sql)
    
    --总条数
    set @recordCount=0;
    set @sql = N'SELECT  @recordCount=Count(1) FROM ' + @Tables + @strFilter
    EXEC sp_executesql @sql,N'@recordCount int out',@RecordCount out
    
    	
    
    GO
    
    


    C#调用代码:

    /// <summary>
            /// 通用分页
            /// </summary>
            /// <param name="pi"></param>
            public virtual void Pager(RPageInfo pi)
            {
                /*存储过程
                 CREATE PROCEDURE UP_Paging
    	            @Tables nvarchar(512), --表名,多张表是请使用 tA a inner join tB b On a.AID = b.AID
    	            @PK nvarchar(128)='',    --主键,可以带表头 a.AID
    	            @Sort nvarchar(512) = '', --排序字段
    	            @PageIndex int = 1,    --开始页码
    	            @PageSize int = 10,        --页大小
    	            @Fields nvarchar(1024) = '*',--读取字段
    	            @Where nvarchar(1024) = NULL,--Where条件
    	            @RecordCount int output --返回总条数
                AS
                 */
                SqlParameter[] parameters = {
    					new SqlParameter("@Tables", SqlDbType.NVarChar,512),
                        new SqlParameter("@PK", SqlDbType.NVarChar,128),
                        new SqlParameter("@Sort", SqlDbType.NVarChar,512),
                        new SqlParameter("@PageIndex", SqlDbType.Int),
                        new SqlParameter("@PageSize", SqlDbType.Int),
                        new SqlParameter("@Fields", SqlDbType.NVarChar,1024),
                        new SqlParameter("@Where", SqlDbType.NVarChar,1024),
                        new SqlParameter("@RecordCount", SqlDbType.Int)
    
    			};
                parameters[0].Value = pi.TableName;
                parameters[1].Value = pi.Pk;
                parameters[2].Value = pi.Sort;
                parameters[3].Value = pi.PageIndex;
                parameters[4].Value = pi.PageSize;
                parameters[5].Value = pi.Fields;
                parameters[6].Value = pi.Fwhere;
                parameters[7].Direction = ParameterDirection.Output;
    
                DataTable data = DbHelperSQL.RunProcedure("UP_Paging", parameters, "ds").Tables[0];
                pi.Data = data;
                pi.RecordCount = Convert.ToInt32(parameters[7].Value);
                pi.PageCount = (long)Math.Ceiling(pi.RecordCount/(pi.PageSize+0.0));
            }


    RPageInfo封装的分页信息,代码如下:

    /// <summary>
        /// 分页信息类
        /// </summary>
        public class RPageInfo
        {
    
            private String _tableName;
            /// <summary>
            /// 表名,可以是子查询,但必须如下:
            ///     (select * from Dept) as model
            /// </summary>
            public String TableName
            {
                get { return _tableName; }
                set { _tableName = value; }
            }
            private String _pk=string.Empty;
            /// <summary>
            /// 主键或者其它字段
            /// </summary>
            public String Pk
            {
                get { return _pk; }
                set { _pk = value; }
            }
            private string _sort = string.Empty;
            /// <summary>
            /// 排序,例如:字段1 ASC,字段2 DESC
            /// 主键和排序字段是互斥的
            /// </summary>
            public string Sort
            {
                get { return _sort; }
                set { _sort = value; }
            }
            private string _fields="*";
            /// <summary>
            /// 要显示的字段,默认为*
            /// </summary>
            public string Fields
            {
                get { return _fields; }
                set { _fields = value; }
            }
            private string _fwhere = string.Empty;
            /// <summary>
            /// 筛选条件
            /// </summary>
            public string Fwhere
            {
                get { return _fwhere; }
                set { _fwhere = value; }
            }
    
            private int _pageIndex = 1;
    
            /// <summary>
            /// 页号
            /// </summary>
            public int PageIndex
            {
                get { return _pageIndex; }
                set { _pageIndex = value; }
            }
            private int _pageSize = 10;
            /// <summary>
            /// 页大小
            /// </summary>
            public int PageSize
            {
                get { return _pageSize; }
                set { _pageSize = value; }
            }
    
            private long _recordCount;
            /// <summary>
            /// 总条数
            /// </summary>
            public long RecordCount
            {
                get { return _recordCount; }
                set { _recordCount = value; }
            }
            private long _pageCount;
            /// <summary>
            /// 总页数
            /// </summary>
            public long PageCount
            {
                get { return _pageCount; }
                set { _pageCount = value; }
            }
            private DataTable _data;
            /// <summary>
            /// 结果集
            /// </summary>
            public DataTable Data
            {
                get { return _data; }
                set { _data = value; }
            }
        }


    使用代码:

    /// <summary>
            /// 获得医院信息
            /// </summary>
            /// <param name="pi"></param>
            /// <param name="isCityHospital">是否县级医院</param>
            /// <param name="hospitalName">医院名称</param>
            public void GetHospitals(RPageInfo pi,bool? isCityHospital,string hospitalName)
            {
                pi.TableName = "(SELECT * FROM [HOSPITAL] WHERE 1=1 ";
                if (isCityHospital!=null && isCityHospital.Value)
                {
                    pi.TableName += " AND [LEVEL]=1";
                }
                else if (isCityHospital != null && !isCityHospital.Value)
                {
                    pi.TableName += " AND [LEVEL]=0";
                }
                if (hospitalName != null && hospitalName.Trim() != string.Empty)
                {
                    pi.TableName += " AND [HOSTPITALNAME] LIKE '%" + hospitalName + "%'";
                }
                pi.TableName += ") AS MODEL ";
                pi.Pk = "HospitalID";
                base.Pager(pi);
            }


  • 相关阅读:
    kolla-ansible 2.8.0 mariadb
    linux find 排除查找目录
    Java 泛型,你了解类型擦除吗?(转)
    「干货分享」表哥亲自传授 bof 秘笈,快收藏
    「Burpsuite练兵场」验证机制漏洞(下篇)
    「Burpsuite练兵场」第二节:验证机制漏洞
    「Burpsuite练兵场」Portswigger Web Security Academy介绍
    定位MFC中SDK用于创建窗口的API
    HackTheBox通关手记之October
    WARN org.springframework.web.servlet.PageNotFound
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3109181.html
Copyright © 2011-2022 走看看