基于mvc实现大数据量分页
2017-08-29 16:38
162 查看
UserInfo.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace MvcDemo.Models { /// <summary> /// 用户实体 /// </summary> public class UserInfo { public string Id { get; set; } public string UserName { get; set; } public string Nation { get; set; } public string TrueName { get; set; } public DateTime Birthday { get; set; } public string LocalAddress { get; set; } public int Gender { get; set; } } /// <summary> /// 分页对象 /// </summary> public class UserPage { public List<UserInfo> user { get; set; } public int TotalCount{get;set;} } }
HomeController.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using MvcProcPage.Service; using MvcProcPage.Models; using PagedList.Mvc; using PagedList; namespace MvcDemo.Controllers { public class HomeController : Controller { //UserService ss = new UserService(); //private List<UserInfo> list=new List<UserInfo>(); IUserService service = new UserService(); public ActionResult Index(int page=1) { //#region 插入10W条数据 //for (int i = 1; i <= 100000; i++) //{ // list.Add( // new UserInfo // { // Id = Guid.NewGuid().ToString(), // UserName = "xiaoming" + i, // Birthday = Convert.ToDateTime("1990-12-11"), // Gender = 1, // LocalAddress = "江苏省", // TrueName = "小明" + i, // Nation = "汉族" // }); //} //ss.InsertAll(list); //return View(); //#endregion var pagelist = service.GetAllList().ToPagedList(page,10); return View(pagelist); } public ActionResult ProcPageIndex(int page=1) { var list = service.GetPageByProcList(page,5); return View(); } public JsonResult GetProList(int page = 1, int pagesize = 10) { var model = service.GetPageByProcList(page, pagesize); return Json(model, JsonRequestBehavior.AllowGet); } public ActionResult TestLog() { int result = 0; int x = 1, y = 0; result = x / y; return View(); } } }
Service文件夹
IUserService.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using MvcProcPage.Models; namespace MvcDemo.Service { interface IUserService { /// <summary> /// 查询所有用户 /// </summary> /// <returns></returns> List<UserInfo> GetAllList(); /// <summary> /// 采用存储过程分页 /// </summary> /// <param name="page"></param> /// <param name="pageSize"></param> /// <returns></returns> UserPage GetPageByProcList(int page = 1, int pageSize = 10); /// <summary> /// 查询单个 /// </summary> /// <param name="id"></param> /// <returns></returns> UserInfo GetUserById(int id); /// <summary> /// 新增单个 /// </summary> /// <param name="model"></param> void InsertSingle(UserInfo model); /// <summary> /// 批量新增 /// </summary> /// <param name="list"></param> void InsertAll(List<UserInfo> list); /// <summary> /// 删除单个 /// </summary> /// <param name="model"></param> void DeleteSingle(UserInfo model); /// <summary> /// 删除所有 /// </summary> void DeleteAll(); /// <summary> /// 修改单个 /// </summary> /// <param name="model"></param> void UpdateSingle(UserInfo model); } }
UserService.cs
using System.Collections.Generic; using MvcProcPage.Models; using System.Data; using System.Data.SqlClient; using System.Configuration; using Dapper; using DapperExtensions; namespace MvcDemo.Service { public class UserService:IUserService { public static string constr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString; IDbConnection conn = new SqlConnection(constr); /// <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; } /// <summary> /// 采用存储过程分页 /// </summary> /// <param name="page"></param> /// <param name="pageSize"></param> /// <returns></returns> public UserPage GetPageByProcList(int page=1,int pageSize=10) { 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", 0, 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; } /// <summary> /// 查询单个 /// </summary> /// <param name="id"></param> /// <returns></returns> public UserInfo GetUserById(int id) { UserInfo model = new UserInfo(); string sql = @"select Id,UserName,Nation,TrueName,Birthday,LocalAddressGender from UserInfo where Id=@id"; using (SqlConnection conn = new SqlConnection(constr)) { conn.Open(); //参数名得和存储过程的变量名相同(参数可以跳跃传,键值对方式即可) //动态类型 //var list = conn.Query("usp_test", new { aId = 11 }, commandType: CommandType.StoredProcedure); //强类型 //list = conn.Query<UserInfo>("P_GridViewPager", new { viewName = "Edu_StudentSelectedCourse", fieldName = "*", keyName = "Id", pageSize = 20, pageNo = 1, orderString = "id" }, commandType: CommandType.StoredProcedure).ToList(); //model = conn.QueryFirst<UserInfo>(sql, commandType: CommandType.Text); model = conn.Get<UserInfo>(id); conn.Close(); } return model; } /// <summary> /// 新增单个 /// </summary> /// <param name="model"></param> public void InsertSingle(UserInfo model) { using (SqlConnection conn = new SqlConnection(constr)) { conn.Open(); conn.Insert<UserInfo>(model); } } /// <summary> /// 批量新增 /// </summary> /// <param name="list"></param> public void InsertAll(List<UserInfo> list) { using (SqlConnection conn = new SqlConnection(constr)) { conn.Open(); conn.Insert<UserInfo>(list); } } /// <summary> /// 删除单个 /// </summary> /// <param name="model"></param> public void DeleteSingle(UserInfo model) { using (SqlConnection conn = new SqlConnection(constr)) { conn.Open(); conn.Delete<UserInfo>(model); } } /// <summary> /// 删除所有 /// </summary> public void DeleteAll() { using (SqlConnection conn = new SqlConnection(constr)) { conn.Open(); conn.Delete<UserInfo>(conn.GetList<UserInfo>()); } } /// <summary> /// 修改单个 /// </summary> /// <param name="model"></param> public void UpdateSingle(UserInfo model) { using (SqlConnection conn = new SqlConnection(constr)) { conn.Open(); conn.Update<UserInfo>(model); } } } }
Index.cshtml
@{ Layout = null; } @using PagedList.Mvc; @using MvcDemo.Models; @model PagedList.IPagedList<UserInfo> <link href="~/Content/bootstrap.css" rel="stylesheet" /> <link href="~/Content/PagedList.css" rel="stylesheet" /> <div class="well"> <table class="table"> <thead> <tr> <th>用户名</th> <th>真实姓名</th> <th>出生日期</th> <th>地址</th> </tr> </thead> <tbody> @if (Model != null && Model.Any()) { foreach (var item in Model) { <tr> <td>@item.UserName </td> <td>@item.TrueName </td> <td>@item.Birthday </td> <td>@item.LocalAddress </td> </tr> } } </tbody> </table> </div> <div class="pagination"> @Html.PagedListPager(Model, page => Url.Action("Index", new { page })) </div> <script src="~/Scripts/bootstrap.js"></script>
ProcPageIndex.cshtml
@{ 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 = 10; 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>" + formatDate(n.Birthday) + "</td>" + "<td>" + n.LocalAddress + "</td>" + "</tr>"; }); $("#tbodylist").html(tbody); } //格式日期 function formatDate(NewDtime) { var dt = new Date(parseInt(NewDtime.slice(6, 19))); var year = dt.getFullYear(); var month = dt.getMonth() + 1; var date = dt.getDate(); var hour = dt.getHours(); var minute = dt.getMinutes(); var second = dt.getSeconds(); return year + "-" + month + "-" + date ; } </script>
TestLog.cshtml
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>TestLog</title> </head> <body> <div> </div> </body> </html>
FilterConfig.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MvcDemo { public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { //filters.Add(new HandleErrorAttribute()); //注释掉系统默认的 filters.Add(new MyErrorAttribute()); //添加我刚才自定义的 } } }
MyErrorAttribute.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MvcDemo { public class MyErrorAttribute:HandleErrorAttribute { public static Queue<Exception> ExceptionQueue = new Queue<Exception>(); public override void OnException(ExceptionContext filterContext) { ExceptionQueue.Enqueue(filterContext.Exception);//加入异常队列 //出现异常的时候可以跳转到异常处理的页面 base.OnException(filterContext); } } }
Global.asax
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; using System.Threading; using log4net; namespace MvcDemo { public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { //log4初始化 log4net.Config.XmlConfigurator.Configure(); AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); ThreadPool.QueueUserWorkItem(o => { while (true) { if (MyErrorAttribute.ExceptionQueue.Count > 0) { Exception ex = MyErrorAttribute.ExceptionQueue.Dequeue(); if (ex != null) { ILog logger = LogManager.GetLogger("testError"); logger.Error(ex.ToString());//将异常信息写入log4 } else { Thread.Sleep(50); } } else { Thread.Sleep(50); } } }); } } }
Web.config
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <log4net> <!-- OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL --> <!-- Set root logger level to ERROR and its appenders --> <root> <level value="ALL"/> <appender-ref ref="SysAppender"/> </root> <!-- Print only messages of level DEBUG or above in the packages --> <logger name="WebLogger"> <!--这里进一步限制了日志级别,只有在大于等于DEBUG情况下才会记录日志--> <!--<level value="DEBUG"/>--> <level value="DEBUG"/> </logger> <!--指定日志记录的方式:以滚动文件的方式--> <appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net" > <!--指定日志存放的路径,这里放置到App_Data目录是为了安全--> <param name="File" value="App_Data/" /> <!--日志以追加的形式记录--> <param name="AppendToFile" value="true" /> <param name="RollingStyle" value="Date" /> <!--设置日志文件名称的生成规则--> <param name="DatePattern" value=""Logs_"yyyyMMdd".txt"" /> <!--日志名称是否静态:否--> <param name="StaticLogFileName" value="false" /> <!--日志内容格式和布局设置--> <layout type="log4net.Layout.PatternLayout,log4net"> <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /> <param name="Header" value="----------------------header-------------------------" /> <param name="Footer" value="----------------------footer--------------------------" /> </layout> </appender> <appender name="consoleApp" type="log4net.Appender.ConsoleAppender,log4net"> <layout type="log4net.Layout.PatternLayout,log4net"> <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /> </layout> </appender> </log4net> <appSettings> <add key="webpages:Version" value="3.0.0.0" /> <add key="webpages:Enabled" value="false" /> <add key="ClientValidationEnabled" value="true" /> <add key="UnobtrusiveJavaScriptEnabled" value="true" /> </appSettings> <connectionStrings> <add name="connStr" connectionString="Data Source=WU-PC;database=MvcPageDB;uid=sa;pwd=123456;" providerName="System.Data.SqlClient" /> </connectionStrings> <system.web> <compilation debug="true" targetFramework="4.5.2" /> <httpRuntime targetFramework="4.5.2" /> <httpModules> <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" /> </httpModules> </system.web> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" /> <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" /> <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" /> </dependentAssembly> </assemblyBinding> </runtime> <system.codedom> <compilers> <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" /> <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+" /> </compilers> </system.codedom> <system.webServer> <validation validateIntegratedModeConfiguration="false" /> <modules> <remove name="ApplicationInsightsWebTracking" /> <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" preCondition="managedHandler" /> </modules> </system.webServer> </configuration>
Sql脚本:
USE [MvcPageDB] GO 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 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[UserInfo]( [Id] [nvarchar](36) NOT NULL, [UserName] [nvarchar](50) NULL, [Nation] [nvarchar](50) NULL, [TrueName] [nvarchar](200) NULL, [Birthday] [datetime] NULL, [LocalAddress] [nvarchar](500) NULL, [Gender] [int] NULL, CONSTRAINT [PK_UserInfo] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO ALTER TABLE [dbo].[UserInfo] ADD CONSTRAINT [DF_UserInfo_Gender] DEFAULT ((0)) FOR [Gender] GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'民族' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'UserInfo', @level2type=N'COLUMN',@level2name=N'Nation' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'真实姓名' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'UserInfo', @level2type=N'COLUMN',@level2name=N'TrueName' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'出生日期' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'UserInfo', @level2type=N'COLUMN',@level2name=N'Birthday' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'地址' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'UserInfo', @level2type=N'COLUMN',@level2name=N'LocalAddress' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'0 男 1 女' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'UserInfo', @level2type=N'COLUMN',@level2name=N'Gender' GO
运行结果如图:
相关文章推荐
- 基于MVC+EasyUI的Web开发框架经验总结(10)--在Web界面上实现数据的导入和导出
- 用java实现一个单线程基于控制台和以文件为数据存储并加上一点MVC思想的ATM
- JDBC基于MVC架构项目实例-实现对MySQL数据表的增删改查、调用数据表中的存储过程和函数
- 基于Spring3 MVC实现批量导出数据成Excel文件!
- 基于Spring3 MVC实现基于form表单上传Excel文件,批量导入数据!
- 基于Spring3 MVC实现基于form表单上传Excel文件,批量导入数据时,报错:Unable to recognize OLE stream !
- 基于数据成员是指向一个数组的指针来实现的list
- 数据挖掘-基于Kmeans算法、MBSAS算法及DBSCAN算法的newsgroup18828文本聚类器的JAVA实现(下)
- K-Means C实现(基于iris数据)
- 基于GOLDENGATE实现数据实时分发
- 转发-基于ASP.NET MVC 4/5 Razor的模块化/插件式架构实现
- 用Maven整合SpringMVC+Spring+Hibernate 框架,实现简单的插入数据库数据功能
- MVC中使用Echart后台加载数据 实现饼图、折线图、全国地图数据,单击双击事件等
- 基于Python实现的微信好友数据分析
- 基于半边数据结构(翼边数据结构)的Eular操作来实现扫成 通过OpenGL进行CAD实体建模 经测试可直接运行
- 基于数据挖掘的健康饮食营养系统实现
- 基于堆排序实现的找出N个数据的前M大数据之Java实现
- 基于MVC和三层架构,用jsp-Servlet-JavaBean实现登录和注册
- 基于UART实现数据的自发自收
- ASP.NET MVC中 Jquery AJAX 获取数据利用MVC模型绑定实现输出