【原创】10万条数据采用存储过程分页实现(Mvc+Dapper+存储过程)
有时候大数据量进行查询操作的时候,查询速度很大强度上可以影响用户体验,因此自己简单写了一个demo,简单总结记录一下:
技术:Mvc4+Dapper+Dapper扩展+Sqlserver
目前主要实现了两种分页:一种采用 PagedList.Mvc 实现的分页
两外一种采用 ajax异步加载分页 采用比较常用的jquery.pagination 分页插件。
功能相对比较简单仅供学习交流。
通用存储过程
USE [MvcProcPageDB]
GO /****** Object: StoredProcedure [dbo].[ProcViewPager] Script Date: 2017/4/23 16:41:16 ******/
SET ANSI_NULLS ON
GO SET QUOTED_IDENTIFIER ON
GO CREATE PROCEDURE [dbo].[ProcViewPager] (
@recordTotal INT OUTPUT, --输出记录总数
@viewName VARCHAR(800), --表名
@fieldName VARCHAR(800) = '*', --查询字段
@keyName VARCHAR(200) = 'Id', --索引字段
@pageSize INT = 20, --每页记录数
@pageNo INT =1, --当前页
@orderString VARCHAR(200), --排序条件
@whereString VARCHAR(800) = '1=1' --WHERE条件
)
AS
BEGIN
DECLARE @beginRow INT
DECLARE @endRow INT
DECLARE @tempLimit VARCHAR(200)
DECLARE @tempCount NVARCHAR(1000)
DECLARE @tempMain VARCHAR(1000)
--declare @timediff datetime set nocount on
--select @timediff=getdate() --记录时间 SET @beginRow = (@pageNo - 1) * @pageSize + 1
SET @endRow = @pageNo * @pageSize
SET @tempLimit = 'rows BETWEEN ' + CAST(@beginRow AS VARCHAR) +' AND '+CAST(@endRow AS VARCHAR) --输出参数为总记录数
SET @tempCount = 'SELECT @recordTotal = COUNT(*) FROM (SELECT '+@keyName+' FROM '+@viewName+' WHERE '+@whereString+') AS my_temp'
EXECUTE sp_executesql @tempCount,N'@recordTotal INT OUTPUT',@recordTotal OUTPUT --主查询返回结果集
SET @tempMain = 'SELECT * FROM (SELECT ROW_NUMBER() OVER (order by '+@orderString+') AS rows ,'+@fieldName+' FROM '+@viewName+' WHERE '+@whereString+') AS main_temp WHERE '+@tempLimit --PRINT @tempMain
EXECUTE (@tempMain)
--select datediff(ms,@timediff,getdate()) as 耗时 set nocount off
END GO
Dapper
/// <summary>
/// 查询所有用户
/// </summary>
/// <returns></returns>
public List<UserInfo> GetAllList()
{
var list = new List<UserInfo>();
//string sql = @"select Id,UserName,Nation,TrueName,Birthday,LocalAddressGender from UserInfo";
using (SqlConnection conn = new SqlConnection(constr))
{
conn.Open();
//标准写法
//list = conn.Query<UserInfo>(sql,commandType: CommandType.Text).AsList();
//dapper扩展写法
list = conn.GetList<UserInfo>().AsList();
conn.Close();
}
return list;
}
Dapper分页
/// <summary>
/// 采用存储过程分页
/// </summary>
/// <param name="page"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
public UserPage GetPageByProcList(int page=,int pageSize=)
{
UserPage model = new UserPage();
var list = new List<UserInfo>();
//string sql = @"select Id,UserName,Nation,TrueName,Birthday,LocalAddressGender from UserInfo";
using (SqlConnection conn = new SqlConnection(constr))
{
conn.Open();
DynamicParameters parm = new DynamicParameters();
parm.Add("viewName", "UserInfo");
parm.Add("fieldName", "*");
parm.Add("keyName", "Id");
parm.Add("pageSize", pageSize);
parm.Add("pageNo", page);
parm.Add("orderString", "Id");
parm.Add("recordTotal", , DbType.Int32, ParameterDirection.Output);
//参数名得和存储过程的变量名相同(参数可以跳跃传,键值对方式即可)
//强类型
//list = conn.Query<UserInfo>("P_GridViewPager", new { viewName = "Edu_StudentSelectedCourse", fieldName = "*", keyName = "Id", pageSize = 20, pageNo = 1, orderString = "id" }, commandType: CommandType.StoredProcedure).ToList();
//标准写法
//list = conn.Query<UserInfo>(sql,commandType: CommandType.Text).AsList();
//dapper扩展写法
//list = conn.GetList<UserInfo>().AsList();
list = conn.Query<UserInfo>("ProcViewPager", parm, commandType: CommandType.StoredProcedure).AsList();
int totalCount = parm.Get<int>("@recordTotal");//返回总页数
model.user = list;
model.TotalCount = totalCount;
conn.Close();
}
return model;
}
public ActionResult Index(int page=)
{ #region 插入10条数据 //for (int i = 1; i <= 100000; i++)
//{
// list.Add(
// new UserInfo
// {
// Id = Guid.NewGuid().ToString(),
// UserName = "xiaoming" + i,
// Birthday = Convert.ToDateTime("1987-12-11"),
// Gender = 1,
// LocalAddress = "河南省",
// TrueName = "小明" + i,
// Nation = "汉族"
// });
//}
//ss.InsertAll(list);
#endregion
var pagelist = service.GetAllList().ToPagedList(page,);
return View(pagelist);
}
public ActionResult ProcPageIndex(int page=)
{
var list = service.GetPageByProcList(page,);
return View();
}
public JsonResult GetProList(int page=,int pagesize=)
{
var model = service.GetPageByProcList(page, pagesize);
return Json(model, JsonRequestBehavior.AllowGet);
}
View
@{
Layout = null;
}
<link href="~/Content/bootstrap.css" rel="stylesheet" />
<link href="~/Content/PagedList.css" rel="stylesheet" />
<link href="~/Scripts/pagination.css" rel="stylesheet" />
<div class="well">
<table class="table">
<thead>
<tr>
<th>用户名</th>
<th>真实姓名</th>
<th>出生日期</th>
<th>地址</th>
</tr>
</thead>
<tbody id="tbodylist"></tbody>
</table>
</div>
<div id="Pagination" class="pagination">
</div>
<script src="~/Scripts/jquery-1.9.1.min.js"></script>
<script src="~/Scripts/jquery.pagination.js"></script>
<script src="~/Scripts/bootstrap.js"></script>
<script type="text/javascript">
//分页查询开始
$(document).ready(function () {
getDataList(0, null);
});
var pagesize = 50;
var page = 1;
var initFlag = true;
function getDataList(currPage, jg) {
$.ajax({
url: "/Home/GetProList",
type: "get",
dataType: 'json',
data: { pagesize: pagesize, page: currPage + 1 },
contentType: "application/x-www-form-urlencoded; charset=utf-8",
success: function (response) {
if (response.user != null && response.user != "" && response.TotalCount != undefined && response.TotalCount > 0) {
if (initFlag) {
$("#Pagination").pagination(
response.TotalCount,
{
items_per_page: pagesize,
num_edge_entries: 1,
num_display_entries: 8,
callback: getDataList//回调函数
});
initFlag = false;
}
$("#tbodylist").html("");
loadDataList(response.user);
} else {
}
}
});
}
function loadDataList(listdata) { var tbody = "";
$(listdata).each(function (i, n) {
//表格
tbody += "<tr>" +
"<td>" + n.UserName + "</td>" +
"<td>" + n.TrueName + "</td>" +
"<td>" + n.Birthday + "</td>" +
"<td>" + n.LocalAddress + "</td>" +
"</tr>";
});
$("#tbodylist").html(html);
} 84 //分页查询结束
</script>
截图


项目地址:https://github.com/hgmsq/mvcprocpage
【原创】10万条数据采用存储过程分页实现(Mvc+Dapper+存储过程)的更多相关文章
- Mvc+Dapper+存储过程分页10万条数据
10万条数据采用存储过程分页实现(Mvc+Dapper+存储过程) 有时候大数据量进行查询操作的时候,查询速度很大强度上可以影响用户体验,因此自己简单写了一个demo,简单总结记录一下: 技术:Mvc ...
- 性能优化:虚拟列表,如何渲染10万条数据的dom,页面同时不卡顿
列表大概有2万条数据,又不让做成分页,如果页面直接渲染2万条数据,在一些低配电脑上可能会照成页面卡死,基于这个需求,我们来手写一个虚拟列表 思路 列表中固定只显示少量的数据,比如60条 在列表滚动的时 ...
- MariaDB(MySql)使用储存过程和随机函数插入10万条数据
))default charset =utf8; #定义一个随机切割字符串的函数 delimiter // create function randStr() ) begin ) default 'A ...
- 最短时间(几秒内)利用C#往SQLserver数据库一次性插入10万条数据
用途说明: 公司要求做一个数据导入程序,要求将Excel数据,大批量的导入到数据库中,尽量少的访问数据库,高性能的对数据库进行存储.于是在网上进行查找,发现了一个比较好的解决方案,就是采用SqlBul ...
- PHP MySQL 快速导入10万条数据
项目背景 数据来源:所有数据均为外部导入,最大数据量在10w+ 输出数据:导出经过业务处理之后的数据 使用框架:fastadmin 涉及的问题: 1.数据读取 2.数据保存 使用数据:10w+ 解决方 ...
- C# 使用EPPlus 秒导出10万条数据
1.先要引用dll文件,可以直接使用vs自带的包管理,如下图: 输入 EPPlus 我这里是安装过了的所以这里显示的是卸载而不是安装. 安装成功了之后会看到这个dll文件 代码如下: //导出Exce ...
- 使用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 ...
- java 批量插入10万条数据
for (int i = 0; i < 100000; i++) { dbHelper.insert("INSERT aaa(name) Values ('1')"); } ...
- 绝对干货,教你4分钟插入1000万条数据到mysql数据库表,快快进来
我用到的数据库为,mysql数据库5.7版本的 1.首先自己准备好数据库表 其实我在插入1000万条数据的时候遇到了一些问题,现在先来解决他们,一开始我插入100万条数据时候报错,控制台的信息如下: ...
随机推荐
- JavaWeb与Asp.net工作原理比较分析
一.概述 不管是什么语言开发的web应用程序,都是在解决一个问题,那就是用户输入url怎么把对应的页面响应出来,如何通过url映射到响应的类,由于自己做asp.net的时间也不短了,还算是对asp.n ...
- SQLServer存储过程实现单条件分页
SQLServer Procedure Pagination_basic: ALTER PROCEDURE [qiancheng].[Pagination_basic] ( ), --name of ...
- Tp框架之模型层
数据模型层是专门针对数据库来操作的 我们在home模块用一下数据模型层 先把配置修改好 我们先来打开这个文件 然后再打开think里面的主配置,把那里面关于数据库的部分,复制到home下的配置文件,然 ...
- 九度oj题目1207:质因数的个数
题目描述: 求正整数N(N>1)的质因数的个数. 相同的质因数需要重复计算.如120=2*2*2*3*5,共有5个质因数. 输入: 可能有多组测试数据,每组测试数据的输入是一个正整数N,(1&l ...
- Permanent Generation Removal Overview(译文)
英文原稿:http://vdisk.weibo.com/s/vxGdGZEZTEjk 中文整理稿:http://it.deepinmind.com/gc/2014/05/14/metaspace-in ...
- Android手机USB调试安全闲扯(315晚会免费充电桩事件)
前言 今年的又准时乖巧的观看了315晚会,与大家一同学习了各种发财致富的方式...咳.咳..学习防范违法行骗的各种手段.比较感兴趣的两个,一人脸识别,二公共充电桩安全隐患.第一个今天不扯, ...
- Linux+Nginx+Asp.net Core部署
上篇<Docker基础入门及示例>文章介绍了Docker部署,以及相关.net core 的打包示例.这篇文章我将以oss.offical.site站点为例,主要介绍下在linux机器下完 ...
- input的type属性引申的日历组件
HTML5规范里只规定date新型input输入类型,并没有规定日历弹出框的实现和样式.所以,各浏览器根据自己的设计实现日历.目前只有谷歌浏览器完全实现日历功能.相信这种局面很快就会结束,所有的浏览器 ...
- 这是对position讲解最通俗易懂的版本了。
position 为了制作更多复杂的布局,我们需要讨论下 position 属性.它有一大堆的值,名字还都特抽象,别提有多难记了.让我们先一个个的过一遍,不过你最好还是把这页放到书签里. static ...
- webpack引入handlebars报错'You must pass a string or Handlebars AST to Handlebars.compile'
背景: webpack作为一个部分替代打包工具和模块化工具的优秀选择出现,作为尝试,也为了构建自己习惯的前端开发方式,我尝试了将webpack和自己常用handlebars模板引擎结合.整体项目背景为 ...