10万条数据采用存储过程分页实现(Mvc+Dapper+存储过程)

有时候大数据量进行查询操作的时候,查询速度很大强度上可以影响用户体验,因此自己简单写了一个demo,简单总结记录一下:

技术:Mvc4+Dapper+Dapper扩展+Sqlserver

目前主要实现了两种分页:一种采用 PagedList.Mvc 实现的分页

两外一种采用 ajax异步加载分页 采用比较常用的jquery.pagination 分页插件。

功能相对比较简单仅供学习交流。

通用存储过程

 1 USE [MvcProcPageDB]
2 GO
3
4 /****** Object: StoredProcedure [dbo].[ProcViewPager] Script Date: 2017/4/23 16:41:16 ******/
5 SET ANSI_NULLS ON
6 GO
7
8 SET QUOTED_IDENTIFIER ON
9 GO
10
11 CREATE PROCEDURE [dbo].[ProcViewPager] (
12 @recordTotal INT OUTPUT, --输出记录总数
13 @viewName VARCHAR(800), --表名
14 @fieldName VARCHAR(800) = '*', --查询字段
15 @keyName VARCHAR(200) = 'Id', --索引字段
16 @pageSize INT = 20, --每页记录数
17 @pageNo INT =1, --当前页
18 @orderString VARCHAR(200), --排序条件
19 @whereString VARCHAR(800) = '1=1' --WHERE条件
20 )
21 AS
22 BEGIN
23 DECLARE @beginRow INT
24 DECLARE @endRow INT
25 DECLARE @tempLimit VARCHAR(200)
26 DECLARE @tempCount NVARCHAR(1000)
27 DECLARE @tempMain VARCHAR(1000)
28 --declare @timediff datetime
29
30 set nocount on
31 --select @timediff=getdate() --记录时间
32
33 SET @beginRow = (@pageNo - 1) * @pageSize + 1
34 SET @endRow = @pageNo * @pageSize
35 SET @tempLimit = 'rows BETWEEN ' + CAST(@beginRow AS VARCHAR) +' AND '+CAST(@endRow AS VARCHAR)
36
37 --输出参数为总记录数
38 SET @tempCount = 'SELECT @recordTotal = COUNT(*) FROM (SELECT '+@keyName+' FROM '+@viewName+' WHERE '+@whereString+') AS my_temp'
39 EXECUTE sp_executesql @tempCount,N'@recordTotal INT OUTPUT',@recordTotal OUTPUT
40
41 --主查询返回结果集
42 SET @tempMain = 'SELECT * FROM (SELECT ROW_NUMBER() OVER (order by '+@orderString+') AS rows ,'+@fieldName+' FROM '+@viewName+' WHERE '+@whereString+') AS main_temp WHERE '+@tempLimit
43
44 --PRINT @tempMain
45 EXECUTE (@tempMain)
46 --select datediff(ms,@timediff,getdate()) as 耗时
47
48 set nocount off
49 END
50
51
52 GO

Dapper

 1   /// <summary>
2 /// 查询所有用户
3 /// </summary>
4 /// <returns></returns>
5 public List<UserInfo> GetAllList()
6 {
7 var list = new List<UserInfo>();
8 //string sql = @"select Id,UserName,Nation,TrueName,Birthday,LocalAddressGender from UserInfo";
9 using (SqlConnection conn = new SqlConnection(constr))
10 {
11 conn.Open();
12 //标准写法
13 //list = conn.Query<UserInfo>(sql,commandType: CommandType.Text).AsList();
14 //dapper扩展写法
15 list = conn.GetList<UserInfo>().AsList();
16 conn.Close();
17 }
18 return list;
19 }

Dapper分页

 1 /// <summary>
2 /// 采用存储过程分页
3 /// </summary>
4 /// <param name="page"></param>
5 /// <param name="pageSize"></param>
6 /// <returns></returns>
7 public UserPage GetPageByProcList(int page=1,int pageSize=10)
8 {
9 UserPage model = new UserPage();
10 var list = new List<UserInfo>();
11 //string sql = @"select Id,UserName,Nation,TrueName,Birthday,LocalAddressGender from UserInfo";
12 using (SqlConnection conn = new SqlConnection(constr))
13 {
14 conn.Open();
15 DynamicParameters parm = new DynamicParameters();
16 parm.Add("viewName", "UserInfo");
17 parm.Add("fieldName", "*");
18 parm.Add("keyName", "Id");
19 parm.Add("pageSize", pageSize);
20 parm.Add("pageNo", page);
21 parm.Add("orderString", "Id");
22 parm.Add("recordTotal", 0, DbType.Int32, ParameterDirection.Output);
23 //参数名得和存储过程的变量名相同(参数可以跳跃传,键值对方式即可)
24 //强类型
25 //list = conn.Query<UserInfo>("P_GridViewPager", new { viewName = "Edu_StudentSelectedCourse", fieldName = "*", keyName = "Id", pageSize = 20, pageNo = 1, orderString = "id" }, commandType: CommandType.StoredProcedure).ToList();
26 //标准写法
27 //list = conn.Query<UserInfo>(sql,commandType: CommandType.Text).AsList();
28 //dapper扩展写法
29 //list = conn.GetList<UserInfo>().AsList();
30 list = conn.Query<UserInfo>("ProcViewPager", parm, commandType: CommandType.StoredProcedure).AsList();
31 int totalCount = parm.Get<int>("@recordTotal");//返回总页数
32 model.user = list;
33 model.TotalCount = totalCount;
34 conn.Close();
35 }
36 return model;
37 }
 1  public ActionResult Index(int page=1)
2 {
3
4 #region 插入10条数据
5
6 //for (int i = 1; i <= 100000; i++)
7 //{
8 // list.Add(
9 // new UserInfo
10 // {
11 // Id = Guid.NewGuid().ToString(),
12 // UserName = "xiaoming" + i,
13 // Birthday = Convert.ToDateTime("1987-12-11"),
14 // Gender = 1,
15 // LocalAddress = "河南省",
16 // TrueName = "小明" + i,
17 // Nation = "汉族"
18 // });
19 //}
20 //ss.InsertAll(list);
21 #endregion
22 var pagelist = service.GetAllList().ToPagedList(page,10);
23 return View(pagelist);
24 }
25 public ActionResult ProcPageIndex(int page=1)
26 {
27 var list = service.GetPageByProcList(page,5);
28 return View();
29 }
30 public JsonResult GetProList(int page=1,int pagesize=10)
31 {
32 var model = service.GetPageByProcList(page, pagesize);
33 return Json(model, JsonRequestBehavior.AllowGet);
34 }

View

 1 @{
2 Layout = null;
3 }
4 <link href="~/Content/bootstrap.css" rel="stylesheet" />
5 <link href="~/Content/PagedList.css" rel="stylesheet" />
6 <link href="~/Scripts/pagination.css" rel="stylesheet" />
7 <div class="well">
8 <table class="table">
9 <thead>
10 <tr>
11 <th>用户名</th>
12 <th>真实姓名</th>
13 <th>出生日期</th>
14 <th>地址</th>
15 </tr>
16 </thead>
17 <tbody id="tbodylist"></tbody>
18
19 </table>
20
21 </div>
22 <div id="Pagination" class="pagination">
23
24 </div>
25 <script src="~/Scripts/jquery-1.9.1.min.js"></script>
26 <script src="~/Scripts/jquery.pagination.js"></script>
27 <script src="~/Scripts/bootstrap.js"></script>
28 <script type="text/javascript">
29 //分页查询开始
30 $(document).ready(function () {
31 getDataList(0, null);
32 });
33
34 var pagesize = 50;
35 var page = 1;
36 var initFlag = true;
37
38 function getDataList(currPage, jg) {
39
40 $.ajax({
41 url: "/Home/GetProList",
42 type: "get",
43 dataType: 'json',
44 data: { pagesize: pagesize, page: currPage + 1 },
45 contentType: "application/x-www-form-urlencoded; charset=utf-8",
46 success: function (response) {
47 if (response.user != null && response.user != "" && response.TotalCount != undefined && response.TotalCount > 0) {
48 if (initFlag) {
49 $("#Pagination").pagination(
50 response.TotalCount,
51 {
52 items_per_page: pagesize,
53 num_edge_entries: 1,
54 num_display_entries: 8,
55 callback: getDataList//回调函数
56 });
57 initFlag = false;
58 }
59 $("#tbodylist").html("");
60 loadDataList(response.user);
61 } else {
62
63 }
64
65 }
66 });
67 }
68
69 function loadDataList(listdata) {71 var tbody = "";
72 $(listdata).each(function (i, n) {
73 //表格
74 tbody += "<tr>" +
75 "<td>" + n.UserName + "</td>" +
76 "<td>" + n.TrueName + "</td>" +
77 "<td>" + n.Birthday + "</td>" +
78 "<td>" + n.LocalAddress + "</td>" +
79 "</tr>";
80 });
81 $("#tbodylist").html(html);
82
83 } 84 //分页查询结束
85 </script>

截图

作者:天使不哭
微信号:hgmyzhl
微信公众号:

Mvc+Dapper+存储过程分页10万条数据的更多相关文章

  1. 性能优化:虚拟列表,如何渲染10万条数据的dom,页面同时不卡顿

    列表大概有2万条数据,又不让做成分页,如果页面直接渲染2万条数据,在一些低配电脑上可能会照成页面卡死,基于这个需求,我们来手写一个虚拟列表 思路 列表中固定只显示少量的数据,比如60条 在列表滚动的时 ...

  2. 【原创】10万条数据采用存储过程分页实现(Mvc+Dapper+存储过程)

    有时候大数据量进行查询操作的时候,查询速度很大强度上可以影响用户体验,因此自己简单写了一个demo,简单总结记录一下: 技术:Mvc4+Dapper+Dapper扩展+Sqlserver 目前主要实现 ...

  3. MariaDB(MySql)使用储存过程和随机函数插入10万条数据

    ))default charset =utf8; #定义一个随机切割字符串的函数 delimiter // create function randStr() ) begin ) default 'A ...

  4. 最短时间(几秒内)利用C#往SQLserver数据库一次性插入10万条数据

    用途说明: 公司要求做一个数据导入程序,要求将Excel数据,大批量的导入到数据库中,尽量少的访问数据库,高性能的对数据库进行存储.于是在网上进行查找,发现了一个比较好的解决方案,就是采用SqlBul ...

  5. PHP MySQL 快速导入10万条数据

    项目背景 数据来源:所有数据均为外部导入,最大数据量在10w+ 输出数据:导出经过业务处理之后的数据 使用框架:fastadmin 涉及的问题: 1.数据读取 2.数据保存 使用数据:10w+ 解决方 ...

  6. C# 使用EPPlus 秒导出10万条数据

    1.先要引用dll文件,可以直接使用vs自带的包管理,如下图: 输入 EPPlus 我这里是安装过了的所以这里显示的是卸载而不是安装. 安装成功了之后会看到这个dll文件 代码如下: //导出Exce ...

  7. 使用virustotal VT 查询情报——感觉远远没有微步、思科好用,10万条数据查出来5万条都有postives >0的记录,尼玛!!!

    1399 git clone https://github.com/VirusTotal/c-vtapi.git 1400 cd c-vtapi/ 1402 sudo apt-get install ...

  8. java 批量插入10万条数据

    for (int i = 0; i < 100000; i++) { dbHelper.insert("INSERT aaa(name) Values ('1')"); } ...

  9. 绝对干货,教你4分钟插入1000万条数据到mysql数据库表,快快进来

    我用到的数据库为,mysql数据库5.7版本的 1.首先自己准备好数据库表 其实我在插入1000万条数据的时候遇到了一些问题,现在先来解决他们,一开始我插入100万条数据时候报错,控制台的信息如下: ...

随机推荐

  1. Libre 6010「网络流 24 题」数字梯形 (网络流,最大费用最大流)

    Libre 6010「网络流 24 题」数字梯形 (网络流,最大费用最大流) Description 给定一个由n 行数字组成的数字梯形如下图所示.梯形的第一行有m 个数字.从梯形的顶部的m 个数字开 ...

  2. POJ 3259 Wormholes(最短路径,求负环)

    POJ 3259 Wormholes(最短路径,求负环) Description While exploring his many farms, Farmer John has discovered ...

  3. 收藏:IPicture总结

    1.IPicture接口对象的创建方法1:直接通过文件创建LPCSTR szFileUrl; IPicture *pIPicture; OleLoadPicturePath(CComBSTR(szFi ...

  4. CodeForces 获得数据

    针对程序的输出可以看见 CodeForces :当输入.输出超过一定字符,会隐藏内容 所以:分若干个程序进行输入数据的获取 1. ;i<=q;i++) { scanf("%ld%ld% ...

  5. duilib踩坑记录

    duilib官方 https://github.com/duilib/duilib duilib他人扩展 https://github.com/qdtroy/DuiLib_Ultimate 关于两者的 ...

  6. javascript函数以及作用域简介

    javascript函数以及作用域简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.基本函数 对于JavaScript中函数参数,实际参数的个数可能小于形式参数的个数,函数内 ...

  7. webpack快速入门——CSS进阶:自动处理CSS3前缀

    为了浏览器的兼容性,有时候我们必须加入-webkit,-ms,-o,-moz这些前缀.目的就是让我们写的页面在每个浏览器中都可以顺利运行. 1.安装 cnpm i postcss-loader aut ...

  8. dedecms织梦让channelartlist标签支持currentstyle属性

    打开include\taglib\channelartlist.lib.php  大约93行 找到: $pv->Fields['typeurl'] = GetOneTypeUrlA($typei ...

  9. 20155339 2016-2017-2 《Java程序设计》第8周学习总结

    20155339 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 第十四章NIO与NIO2 NIO使用频道来衔接数据节点,在处理数据时,NIO可以让你设定缓冲 ...

  10. UVALive 6467 Strahler Order

    > 题目链接 题意:给定一个有向图,顶点代表水池,入度为零的定点代表水源,等级是1,他们延河道(有向边)冲撞,对于普通的水池来说,题目给定判断它等级的两个准则,问出度为零的那个点的等级是多少. ...