通用SQL存储过程分页以及asp.net后台调用的方法

 更新时间:2016年12月08日 09:12:17   投稿:jingxian  
下面小编就为大家带来一篇通用SQL存储过程分页以及asp.net后台调用的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

创建表格并添加300万数据

use Stored
CREATE TABLE UserInfo( --创建表
id int IDENTITY(1,1) PRIMARY KEY not null,--添加主键和标识列
UserName varchar(50) 
)
 
declare @i int --添加3百万数据,大概4分钟时间
set @i=1
while @i<3000000
begin
insert into UserInfo (UserName) values(@i)
set @i=@i+1
end

存储过程T-SQL

create PROCEDURE [dbo].[GetDataList]
(
 @TableName varchar(5000),    --表名
 @Fields varchar(5000) = '*',   --字段名(全部字段为*)
 @OrderField varchar(5000),    --排序字段(必须!支持多字段)
 @OrderType varchar(5000),    --排序类型
 @sqlWhere varchar(5000) = Null, --条件语句(不用加where)
 @pageSize int,          --每页多少条记录
 @pageIndex int = 1 ,       --指定当前为第几页
 @TotalPage int output,      --返回总页数 
 @totalRecord int output    --计算总记录数       --返回总记录数
 )
as
begin  Begin Tran --开始事务  
  
  Declare  @sql nvarchar(500); 
  if (@SqlWhere='' or @sqlWhere=NULL)
    set @sql = 'select @totalRecord = count(*) from ' + @TableName
  else
    set @sql = 'select @totalRecord = count(*) from ' + @TableName + ' where ' + @sqlWhere  
      EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT--计算总记录数 
        
  
  --计算总页数
  select @TotalPage=CEILING((@totalRecord+0.0)/@PageSize)  if (@SqlWhere='' or @sqlWhere=NULL)
    set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField +' ' + @Ordertype+' ) as rowId,' + @Fields + ' from ' + @TableName 
  else
    set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField +' ' + @Ordertype+' ) as rowId,' + @Fields + ' from ' + @TableName + ' where ' + @SqlWhere  

--处理页数超出范围情况
  if @PageIndex<=0 
    Set @pageIndex = 1
  
  if @pageIndex>@TotalPage
    Set @pageIndex = @TotalPage   --处理开始点和结束点
  Declare @StartRecord int
  Declare @EndRecord int
  
  set @StartRecord = (@pageIndex-1)*@PageSize + 1
  set @EndRecord = @StartRecord + @pageSize - 1  --继续合成sql语句
  set @Sql = @Sql + ') as ' + @TableName + ' where rowid between ' + Convert(varchar(50),@StartRecord) + ' and ' + Convert(varchar(50),@EndRecord) 
  --print @Sql 
  
   Exec(@Sql)
  ---------------------------------------------------
  If @@Error <> 0
   Begin
    RollBack Tran
    Return -1
   End
   Else
   Begin
    Commit Tran
    Return @totalRecord ---返回记录总数
   End  
end
--exec GetDataList 'Userinfo','*','id','desc','',10,1,3,3000000

前台页面Default2.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title></title>
</head>
<body>
  <form id="form1" runat="server">
  <div>
   <asp:GridView ID="GridView1" runat="server">
    </asp:GridView>
    <asp:Label ID="lbl_page" runat="server" Text="Label"></asp:Label>
  </div>
  </form>
</body>
</html>

后台CS代码Default2.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Text;


public partial class Default2 : System.Web.UI.Page
{  
  private int PageIndex = 0;//当前页码
  private int PageSize = 50;//每页几条记录
  private int TotalPage = 1;//总分页数
  private int TotalRecord = 0;//总记录
  private string OrderType = " desc";//排序方式 默认正序
  protected void Page_Load(object sender, EventArgs e)
  {
    if (!IsPostBack)
    {
      GetParams();
      DataSet ds = PageData("UserInfo", "*", "id", OrderType, "", PageSize, PageIndex, out TotalPage, out TotalRecord);
      GridView1.DataSource = ds;
      GridView1.DataBind();
      lbl_page.Text = GetDivPager("", ds);
    }
  }

  //数据库连接字符
  public static string StrConn()
  {
    //return string.Format("{0}","server=.;database=Stored;user=sa;password=123456");
    return ConfigurationSettings.AppSettings["ConnString"].ToString();
  }
  //Get方式获得下一页
  private void GetParams()
  {
    if (!String.IsNullOrEmpty(Request["page"]))
    {
      PageIndex = Convert.ToInt32(Request["Page"]);
    }
    else
    {
      PageIndex = 1;
    }
  }
  #region 获得分页字符
  public string GetDivPager(string queryString, DataSet ds)
  {
    StringBuilder sp = new StringBuilder();
    int TotalCount = TotalRecord;
    int rowCount = TotalPage;
    if (ds != null)
    {
      sp.AppendFormat(" <p>总记录:<span id=\"sum\">{0}</span>", TotalCount);
      sp.AppendFormat(" 页码:<em><b id=\"current\">{0}</b>/<span id=\"count\">{1}</span></em> ", PageIndex, rowCount);
      sp.AppendFormat(" 每页:<span id=\"eachPage\">{0}</span></p> ", PageSize);
      
      sp.AppendFormat(" <a href='{0}'>首页</a> ", "?page=1" + queryString);
      if (PageIndex > 1)
      {
        sp.AppendFormat(" <a href='{0}'>< 上一页 </a>", "?page=" + (PageIndex - 1) + queryString);
      }
      int temp = 0;
      int loopc = rowCount > 10 ? 10 : rowCount;
      for (int i = 0; i < loopc; i++)
      {
        temp = i + 1;
        if (PageIndex > 10) { temp = (PageIndex - 10) + i + 1; }
        sp.AppendFormat(" <a class=\"{0}\" href='{1}'>{2}</a>", PageIndex == temp ? "active" : "", "?page=" + temp + queryString, temp);
      }
      if (PageIndex != rowCount)
      {
        sp.AppendFormat(" <a href='{0}'>下一页 ></a>", "?page=" + (PageIndex + 1) + queryString);
      }
      sp.AppendFormat(" <a href='{0}'>尾页</a>", "?page=" + rowCount + queryString);
     
    }
    else
    {
      ds = null;
    }
    return sp.ToString();
  }
  #endregion
  #region 获取分页的数据
  /// <summary>
  /// 获取分页的数据
  /// </summary>
  /// <param name="TblName">数据表名</param>
  /// <param name="Fields">要读取的字段</param>
  /// <param name="OrderField">排序字段</param>
  /// <param name="OrderType">排序方式</param>
  /// <param name="SqlWhere">查询条件</param>
  /// <param name="PageSize">每页显示多少条数据</param>
  /// <param name="pageIndex">当前页码</param>
  /// <param name="TotalPage">返回值,共有多少页</param>
  /// <param name="TotalRecord">返回值,总有多少条记录</param>
  /// <returns></returns>
  public static DataSet PageData(string TblName, string Fields, string OrderField, string OrderType, string SqlWhere, int PageSize, int pageIndex, out int TotalPage, out int TotalRecord)
  {

    SqlConnection conn = new SqlConnection(StrConn());
    SqlCommand comm = new SqlCommand("GetDataList", conn);

    comm.Parameters.Add(new SqlParameter("@TableName", SqlDbType.NVarChar, 100)).Value = TblName;
    comm.Parameters.Add(new SqlParameter("@Fields", SqlDbType.NVarChar, 1000)).Value = Fields;
    comm.Parameters.Add(new SqlParameter("@OrderField", SqlDbType.NVarChar, 1000)).Value = OrderField;
    comm.Parameters.Add(new SqlParameter("@OrderType", SqlDbType.NVarChar, 1000)).Value = OrderType;
    comm.Parameters.Add(new SqlParameter("@sqlWhere", SqlDbType.NVarChar, 1000)).Value = SqlWhere;
    comm.Parameters.Add(new SqlParameter("@pageSize", SqlDbType.Int)).Value = PageSize;
    comm.Parameters.Add(new SqlParameter("@pageIndex", SqlDbType.Int)).Value = pageIndex;
    comm.Parameters.Add(new SqlParameter("@TotalPage", SqlDbType.Int));

    comm.Parameters["@TotalPage"].Direction = ParameterDirection.Output;//获得out出来的参数值

    comm.Parameters.Add(new SqlParameter("@totalRecord", SqlDbType.Int));
    comm.Parameters["@totalRecord"].Direction = ParameterDirection.Output;

    comm.CommandType = CommandType.StoredProcedure;

    SqlDataAdapter dataAdapter = new SqlDataAdapter(comm);
    DataSet ds = new DataSet();
    dataAdapter.Fill(ds);

    TotalPage = (int)comm.Parameters["@TotalPage"].Value;
    TotalRecord = (int)comm.Parameters["@totalRecord"].Value;

    conn.Close();
    conn.Dispose();
    comm.Dispose();
    
    return ds;
  }
  #endregion
}

以上这篇通用SQL存储过程分页以及asp.net后台调用的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • mysql增量备份及断点恢复脚本实例

    mysql增量备份及断点恢复脚本实例

    生产环境中在mysql中误操作是非常正常的,所以就需要用到mysql的增量备份恢复。增量备份是我们经常用到的,它可以指定某个误操作的时间以及位置点进行数据恢复,更加准确的恢复我们想要还原的数据。
    2018-09-09
  • MySQL存储函数以及触发器详解

    MySQL存储函数以及触发器详解

    这篇文章详细给大家介绍了MySQL-SQL存储函数以及触发器,文中有详细的代码示例,对我们学习MySQL有一定的帮助,感兴趣的朋友可以参考阅读下
    2023-06-06
  • select into from和insert into select的区别举例详解

    select into from和insert into select的区别举例详解

    这篇文章主要介绍了SQL中的SELECT INTO和INSERT INTO SELECT两种语句的区别和用法,SELECT INTO用于创建新表并复制数据到新表中,而INSERT INTO SELECT用于将数据从一个表插入到已存在的另一个表中,需要的朋友可以参考下
    2025-03-03
  • MySQL中的流式查询及游标查询方式

    MySQL中的流式查询及游标查询方式

    这篇文章主要介绍了MySQL中的流式查询及游标查询方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • MySQL8 批量修改字符集脚本

    MySQL8 批量修改字符集脚本

    本文主要介绍了MySQL8 批量修改字符集脚本,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • MySQL中的触发器trigger用法解析

    MySQL中的触发器trigger用法解析

    这篇文章主要介绍了MySQL中的触发器trigger用法解析,触发器是由 事件来触发 某个操作,这些事件包括 INSERT、UPDATE、DELETE事件,事件就是指用户的动作或者触发某项行为,需要的朋友可以参考下
    2023-08-08
  • 系统高吞吐量下的数据库重复写入问题分析解决

    系统高吞吐量下的数据库重复写入问题分析解决

    这篇文章主要介绍了系统高吞吐量下的数据库重复写入问题分析解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • Mysql事务索引知识汇总

    Mysql事务索引知识汇总

    这篇文章主要介绍了Mysql事务索引知识汇总,mysql事务是用于处理操作量大、复杂性高的数据,索引能加快数据库的查询速度并高效获取指定的数据,下文相关详细内容,需要的小伙伴可以参考一下
    2022-03-03
  • MySQL分区表的详细介绍

    MySQL分区表的详细介绍

    当设计MySQL分区表时,需要考虑以下几个方面,分区策略、分区字段、分区数量和分区函数,本文就来介绍一下MySQL分区表,感兴趣的可以了解一下
    2023-10-10
  • MySQL派生表联表查询实战过程

    MySQL派生表联表查询实战过程

    派生表是查询结果组成的虚拟表,派生表是在外部查询的FROM子句中定义的,不需要手动创建,下面这篇文章主要给大家介绍了关于MySQL派生表联表查询的相关资料,需要的朋友可以参考下
    2022-03-03

最新评论