C#基于数据库存储过程的AJAX分页实例
本文实例讲述了c#基于数据库存储过程的ajax分页实现方法。分享给大家供大家参考。具体如下:
首先我们在数据库(sql server)中声明定义存储过程
if(exists(select * from sys.objects where name='proc_location_paging')) --如果这个proc_location_paging存储过程存在则删除
drop proc proc_location_paging
go
create proc proc_location_paging --创建存储过程
(
@pagesize int, --页大小
@currentpage int, --当前页
@rowcount int output, --总行数(传出参数)
@pagecount int output --总页数(传出参数)
)
as
begin
select @rowcount= count(locid) from location --给@rowcount赋值
select @pagecount= ceiling((count(locid)+0.0)/@pagesize) from location --给@pagecount赋值
select top (@pagesize)* from (select row_number() over(order by locid) as rowid,* from location) as t1
where rowid >(@pagesize*(@currentpage-1))
end
go
---------------------------------以上就表示这个存储过程已经定义完了。
---------------------------------以下是执行这个存储过程。我们可以看结果
declare @rowcount int,@pagecount int --先声明两个参数
--执行proc_location_paging这个存储过程。@rowcount,@pagecount后面都有output 表示它们两是输出参数
exec proc_location_paging 10,1,@rowcount output,@pagecount output
select @rowcount,@pagecount --查询这两个参数的值
因为是直接访问数据库的,所以我们将下面这条方法写入到dal层中,这里我将它写入到sqlhelper中
using system.collections.generic;
using system.linq;
using system.text;
using system.configuration;
using system.data.sqlclient;
using system.data;
using system.reflection;
namespace llsql.dal
{
public class sqlhelper
{
/// <summary>
/// 获取连接数据库字符串
/// </summary>
private static string connstr = configurationmanager.connectionstrings["connstr"].connectionstring;
public static datatable executeprocpagelist(int pagesize, int currentpage, out int rowcount, out int pagecount)
{
using (sqlconnection conn = new sqlconnection(connstr))
{
conn.open();
using (sqlcommand cmd = conn.createcommand())
{
cmd.commandtext = "proc_location_paging"; //存储过程的名字
cmd.commandtype = commandtype.storedprocedure; //设置命令为存储过程类型(即:指明我们执行的是一个存储过程)
rowcount = 0;
pagecount = 0;//这里随便给rowcount,pagecount赋个值,因为使用out传递参数的时候,在方法内部一定要给out参数赋值才能用它,但是虽然这里给它赋初值了,但是在执行存储过程中,存储过程又会给这两个参数赋值,并返还回来给我们,那个才是我们要值
sqlparameter[] parameters ={
new sqlparameter("@pagesize",pagesize),
new sqlparameter("@currentpage",currentpage),
new sqlparameter("@rowcount",rowcount),
new sqlparameter("@pagecount",pagecount)
};
//因为在存储过程中@rowcount 与@pagecount 是一个输出参数(output), 而parameters这个数组里,第三,和第四个参数就是要用来替换掉这两个输出参数的,所以这里要将parameters这个数组里的这两个参数设为输出参数。
parameters[2].direction = parameterdirection.output;
parameters[3].direction = parameterdirection.output;
cmd.parameters.addrange(parameters); //将参数传递给我们的cmd命令对象
datatable dt = new datatable();
using (sqldataadapter adapter = new sqldataadapter(cmd))
{
adapter.fill(dt);//到数据库去执行存储过程,并将结果填充到dt表中
}
//等存储过程执行完毕后,存储过程会把这两个输出参数传递出来。那么我们在这里来取得这两个返回参数。
rowcount = convert.toint32(parameters[2].value);
pagecount = convert.toint32(parameters[3].value);
return dt;
}
}
}
}
}
在dal文件夹中( 层中) 创建一个aticel.cs类 产生一个list
using system.collections.generic;
using system.linq;
using system.web;
using system.data;
using llsql.dal;
using webapplication1.model;
namespace webapplication1.dal
{
public class aticel
{
public static list<location> getpagelistbypageindex(int pagesize,int currentpage,out int rowcount,out int pagecount)
{
datatable dt= sqlhelper.executeprocpagelist(pagesize, currentpage,out rowcount,out pagecount);
var list = new list<location>();// 声明一个泛型对象list
if (dt != null && dt.rows.count > 0)
{
//将datatable转换成一个list
list = (from p in dt.asenumerable() //(遍历datatable)
select new model.location
{
locid = p.field<int>("locid"), //将datetable里的字段赋值给location类中的属性
locname = p.field<string>("locname"),
parentid = p.field<int>("parentid"),
loctype = p.field<short>("loctype"),
elongcode = p.field<string>("elongcode"),
citycode = p.field<string>("citycode"),
baidupos = p.field<string>("baidupos"),
versions = p.field<short>("version")
}).tolist();
}
return list; //将这个list返回回去
}
}
}
在api这个文件夹中创建一个getpagedata.ashx 页 (bll层) 在这里调用adl层里的 aticel.cs类中的getpagelistbypageindex()方法,获取一个list 并将这个list转换成一个json格式字符串, 共ajax 异步请求得到。
using system.collections.generic;
using system.linq;
using system.web;
using system.web.script.serialization;
namespace webapplication1.api
{
/// <summary>
/// getpagedata 的摘要说明
/// </summary>
public class getpagedata : ihttphandler
{
/// <summary>
/// 根据用户传递的当前页的页码来获取数据
/// </summary>
/// <param name="context"></param>
public void processrequest(httpcontext context)
{
context.response.contenttype = "text/plain";
int pagesize = 10; //设定页大小,每页显示10条数据
int currentpage = convert.toint32(context.request.querystring["currentpage"]); //设定当前页
int rowcount = 0; //作为out参数传递给方法,在方法里给rowcount赋值
int pagecount = 0; //作为out参数传递给方法,在方法里给rowcount赋值
string jsondata = null;
list<model.location> list= dal.aticel.getpagelistbypageindex(pagesize, currentpage, out rowcount, out pagecount);
if (list != null && list.count > 0)
{
//创建json序列化器,将对象转换成一个json格式的字符串
javascriptserializer jsz = new javascriptserializer();
jsondata = jsz.serialize(list); //将一个list对象转换成json格式的字符串
context.response.write(jsondata);
}
else
{
context.response.write("no");
}
}
public bool isreusable
{
get
{
return false;
}
}
}
}
前端页面 (将ajax请求得到的数据展示也页面)
<!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>使用ajax分页</title>
<script src="jquery-1.11.2.js" type="text/javascript"></script>
<style type="text/css">
table{ margin:80px 500px; }
td{ width:50px; height:auto}
</style>
<script type="text/javascript">
$(function () {
$.get("api/getpagedata.ashx?currentpage=2", function (obj) { //假设当前页是第二页currentpage=2
//debugger;
var jsondata = $.parsejson(obj);
//alert(jsondata[0].locid);
//debugger;
for (var i = 0; i < jsondata.length; i++) {
var data = "<tr><td >" + jsondata[i].locid + "</td><td >" + jsondata[i].locname + "</td><td >" + jsondata[i].parentid + "</td><td >" + jsondata[i].loctype + "</td><td >" + jsondata[i].elongcode + "</td><td >" + jsondata[i].citycode + "</td><td >" + jsondata[i].baidupos + "</td><td >" + jsondata[i].versions + "</td></tr>";
$("#t1").append(data);
}
})
})
</script>
</head>
<body>
<table border="1" cellpadding="5" cellspacing="0" style="margin-top:100px;width:600px;" id="t1">
<tr><td>编号</td><td >城市名</td><td >父id</td><td >loctype</td><td >elongcode</td><td >citycode</td><td >baidupos</td><td >version</td></tr>
</table>
</body>
</html>
希望本文所述对大家的c#程序设计有所帮助。