zoukankan      html  css  js  c++  java
  • .net海量分页数据存储过程



    前一段时间做了一个海量的数据存储过程,并做了一个测试版的程序。希望对大家有所帮助。 网上很多这样的存储过程,但是依次试过之后,还是这样的分页较好,并且网上很少有测试程序,即使找到了存储过程,但是调用过程也极为麻烦。
    ------------------------------------
    --支持任意排序的分页存储过程
    ------------------------------------


    CREATE PROCEDURE pagination
    @tblName varchar(255), -- 表名
    @strGetFields varchar(1000) = '*', -- 需要返回的列
    @fldName varchar(255)='', -- 排序的字段名
    @PageSize int , -- 页尺寸
    @PageIndex int, -- 页码
    @doCount bit , -- 返回记录总数, 非 0 值则返回
    @OrderType bit , -- 设置排序类型, 非 0 值则降序
    @strWhere varchar(1500) = '' -- 查询条件 (注意: 不要加 where)
    AS
    declare @strSQL varchar(5000) -- 主语句
    declare @strTmp varchar(110) -- 临时变量
    declare @strOrder varchar(400) -- 排序类型

    if @doCount != 0
    begin
    if @strWhere !=''
    set @strSQL = "select count(*) as Total from [" + @tblName + "] where "+@strWhere
    else
    set @strSQL = "select count(*) as Total from [" + @tblName + "]"
    end
    --以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况
    else
    begin

    if @OrderType != 0
    begin
    set @strTmp = "<(select min"
    set @strOrder = " order by [" + @fldName +"] desc"
    --如果@OrderType不是0,就执行降序,这句很重要!
    end
    else
    begin
    set @strTmp = ">(select max"
    set @strOrder = " order by [" + @fldName +"] asc"
    end

    if @PageIndex = 1
    begin
    if @strWhere != ''
    set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ " from [" + @tblName + "] where " + @strWhere + " " + @strOrder
    else
    set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ " from ["+ @tblName + "] "+ @strOrder
    --如果是第一页就执行以上代码,这样会加快执行速度
    end
    else
    begin
    --以下代码赋予了@strSQL以真正执行的SQL代码
    set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ " from ["
    + @tblName + "] where [" + @fldName + "]" + @strTmp + "(["+ @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["+ @fldName + "] from [" + @tblName + "]" + @strOrder + ") as tblTmp)"+ @strOrder

    if @strWhere != ''
    set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ " from ["
    + @tblName + "] where [" + @fldName + "]" + @strTmp + "(["
    + @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
    + @fldName + "] from [" + @tblName + "] where " + @strWhere + " "
    + @strOrder + ") as tblTmp) and " + @strWhere + " " + @strOrder
    end
    end
    exec (@strSQL)
    GO

    调用的程序(为了通用性,我写了一个方法,大家可以提意见,也可以对其进行修改,多多交换意见,共同进步)
    private static DataSet GetCustomersData(string tblName, string strGetFields,string fldName, int PageSize, int PageIndex, int doCount, int OrderType, string strWhere)
    {
        string connString = ConfigurationSettings.AppSettings["connstr"];
        SqlConnection conn = new SqlConnection(connString);
        SqlCommand comm = new SqlCommand("pagination3", conn);

        comm.Parameters.Add(new SqlParameter("@tblName", SqlDbType.VarChar));//表名
        comm.Parameters[0].Value =tblName ;
        comm.Parameters.Add(new SqlParameter("@strGetFields", SqlDbType.VarChar));//返回的列
        comm.Parameters[1].Value = strGetFields;
        comm.Parameters.Add(new SqlParameter("@fldName", SqlDbType.VarChar));//排序的字段名
        comm.Parameters[2].Value = fldName;
        comm.Parameters.Add(new SqlParameter("@PageSize",SqlDbType.Int));//页尺寸
        comm.Parameters[3].Value = PageSize;
        comm.Parameters.Add(new SqlParameter("@PageIndex", SqlDbType.Int));//页码
        comm.Parameters[4].Value = PageIndex;
        comm.Parameters.Add(new SqlParameter("@doCount", SqlDbType.Int));//是否返回记录总数,0为不返回,1为返回
        comm.Parameters[5].Value = doCount;
        comm.Parameters.Add(new SqlParameter("@OrderType", SqlDbType.Int));//设置排序类型,0为升序,非0为降序
        comm.Parameters[6].Value = OrderType;
        comm.Parameters.Add(new SqlParameter("@strWhere", SqlDbType.VarChar));//where语句
        comm.Parameters[7].Value = strWhere;
        comm.CommandType = CommandType.StoredProcedure;
        SqlDataAdapter dataAdapter = new SqlDataAdapter(comm);
        DataSet ds = new DataSet();
        dataAdapter.Fill(ds);
        return ds;
    }


    转自csdn
    Tags: 分页 | 海量、存储过程 | CSDN | Sql | 
  • 相关阅读:
    POJ 1015 Jury Compromise【DP】
    POJ 1661 Help Jimmy【DP】
    HDU 1074 Doing Homework【状态压缩DP】
    HDU 1024 Max Sum Plus Plus【DP,最大m子段和】
    占坑补题。。最近占的坑有点多。。。
    Codeforces 659F Polycarp and Hay【BFS】
    Codeforces 659E New Reform【DFS】
    Codeforces 659D Bicycle Race【计算几何】
    廖大python实战项目第四天
    廖大python实战项目第三天
  • 原文地址:https://www.cnblogs.com/mahongbo/p/1413875.html
Copyright © 2011-2022 走看看