利用ASP.NET开发Web数据库的查询功能模块时,为了减少网络流量,提高页面的访问速度,一般不会将所有的查询结果完全在一页中显示出来,而是将其按照一定规则分成多页进行显示,每页显示一定数目记录。应用数据记录分页技术,可以提高数据的查询性能及页面的显示速度,减轻数据库服务器的负担。
1 ASP.NET查询分页技术概述
对Web数据库查询结果进行分页显示主要有两种实现方式,分别是浏览器端分页和服务器端分页。浏览器端分页是先将数据库中所有满足查询条件的记录一次性保存下来,然后通过设置每页要显示的记录数,再确定要显示记录的起点和终点来实现分页显示。服务器端分页是根据用户的请求,每次分别从满足查询条件的记录中将规定数目的记录数作读取并显示出来。
为此,我们采用服务器端分页的方式。在浏览器端进行分页时,为了减少网络的流量,我们采用SQL Server的存储过程进行分页。
2 主要技术
ADO.NET类
在Web应用系统中,ASP.NET使用ADO.NET将系统前端的Web浏览器和后台的数据库之间联系起来。ADO.NET是.NET Framework提供的一系列类,提供了对关系数据、XML和应用程序数据的访问。
3 ASP.NET查询分页技术的实现
在此,我们使用System.data.SqlClient(包含访问SQL Server数据库的类)对MS SQL Server2000进行操作,使用ASP.NET中的C#语言进行描述。以笔者开发的“在线考试系统”中的“查看学生留言信息模块”为例来说明该项技术的开发过程。
3.1连接数据库
要访问数据,必须首先连接数据库,在此我们利用System.data.SqlClient.SqlConnection类来连接SQL Server中Student的数据库。用到主要属性和方法如下:
ConnectionString
获取或设置用于打开SQL Server数据库的字符串
Open
使用ConnectionString所指定的属性设置打开数据库连接
Close
关闭与数据库的连接
连接字符串如下:
- SqlConnection SCN = new SqlConnection("server=;database=BSNetExam;uid=sa;pwd=");
3.2 存储过程的建立
- CREATE PROCEDURE PageCut
- @PageSize int=10 , -- 页面大小
- @PageIndex int=1 --当前页数
- AS
- declare @strSQL varchar(500)
- if @PageIndex=1
- set @strSQL='select top'+str(@PageSize)+'* from tdbLevMess order by rqsj'
- else
- set @strSQL='select top'+str(@PageSize)+' * from tdbLevMess where rqsj not in
- (select top '+str((@PageIndex-1)*@PageSize)+' rqsj from tdbpres) order by rqsj'
- exec(@strSQL)
- GO
3.3操作数据库
查询数据操作可以通过多种方式来实现,常用的对象包括SqlCommand对象(表示一个SQL查询或者一个存储过程)和SqlDataAdpater对象(把一个SqlCommand提交给SQL Server数据库)。在此,我们使用SqlCommand对象来操作数据库。
SqlCommand类位于System.Data.SqlClient空间中,表示要对SQL Server数据库执行的一个Transact-SQL语句或存储过程。本例中用到的属性和方法如下:
CommandText
获取或设置要对数据源执行的 Transact-SQL 语句或存储过程。
CommandType
获取或设置一个值,该值指示如何解释 CommandText 属性。
Connection
获取或设置 SqlCommand 的此实例使用的 SqlConnection。
Parameters
获取 SqlParameterCollection。
ExecuteReader
将 CommandText 发送到 Connection 并生成一个 SqlDataReader。
SqlParameter类位于System.Data.SqlClient空间中,表示 SqlCommand 的参数,也可以是它到 DataSet 列的映射。本例中用到的Value属性(获取或设置该参数的值)。
其实现程序如下:
- SqlCommand SCM=new SqlCommand(); //定义SqlCommand类
- SqlDataReader SDR; //定义SqlDataReader类
- private void GridView_Init(int PageSize,int PageIndex)
- {
- SCN.Open(); //打开数据库连接
- SCM.Connection = SCN;
- SCM.CommandText = "pagecut"; //执行存储过程
- SCM.CommandType = CommandType.StoredProcedure;
- SqlParameter[] pares ={ new SqlParameter("@PageSize",SqlDbType.Int),
- new SqlParameter("@PageIndex",SqlDbType.Int)};
- pares[0].Value = PageSize;
- pares[1].Value = PageIndex;
- SCM.Parameters.Clear(); //清空参数
- foreach (SqlParameter parameter in pares)
- {
- SCM.Parameters.Add(parameter);
- }
- SDR = SCM.ExecuteReader(); //执行存储过程
- GridView1.DataSource = SDR; //定义GridView的数据源
- GridView1.DataBind(); // GridView数据源绑定
- SCN.Close(); //关闭连接
- }
3.4 程序的实现
在Web窗体上,添加一个GridView控件(用于数据的显示),四个LinkButton(用作超级链接,分别为首页、上一页、下一页、末页),一个Label控件。将GridView控件的AllowPaging(是否在GridView中打开分页功能)属性设置为False。我们利用Session对象保存分页程序中的参数。具体程序如下:
- protected void Page_Load(object sender, EventArgs e)
- {//页面初始化
- if (!IsPostBack) //如果页面不是***次加载
- {
- int PageCount,PageIndex,PageSize; //定义页面总数、当前页面号、每页记录数
- SCN.Open();
- SCM.CommandText = "select count(*) from tdbLevMess ";
- SCM.Connection = SCN;
- int ReCount = Convert.ToInt32(SCM.ExecuteScalar().ToString());//数据集记录总数
- SCN.Close();
- Session.Add("PageSize", 20); //为共享变量每页记录数PageSize赋值
- PageSize = Convert.ToInt16(Session["PageSize"]);//每页记录数为20
- PageCount=ReCount % PageSize == 0? ReCount / PageSize: ReCount / PageSize + 1;//计算页面的总页数
- Session.Add("PageCount", PageCount); //为共享变量总页数PageCount赋值
- PageIndex = 1;
- Session.Add("PageIndex", PageIndex); //为共享变量总页数PageIndex赋值
- GridView_Init (PageSize, PageIndex); //调用过程为GridView填充数据
- LinkButton1.Enabled = false, LinkButton2.Enabled = false;
- LinkButton3.Enabled = true,LinkButton4.Enabled = true;
- Label1.Text = "第"+PageIndex.ToString() + "页/共" + PageCount.ToString() + "页";
- }
- }
- protected void LinkButton2_Click(object sender, EventArgs e)
- {//上一页按钮
- int PageIndex = Convert.ToInt16( Session["PageIndex"] )- 1;
- int PageCount = Convert.ToInt16( Session["PageCount"]);
- Session.Add("PageIndex", PageIndex);
- int PageSize = Convert.ToInt16(Session["PageSize"]);
- if (PageIndex < = 1)
- {
- LinkButton1.Enabled = false;
- LinkButton2.Enabled = false;
- }
- LinkButton3.Enabled = true;
- LinkButton4.Enabled = true;
- GridView_Init(PageSize, PageIndex);
- Label1.Text = "第" + PageIndex.ToString() + "页/共" + PageCount.ToString() + "页";
- }
我们只给出了LinkButton2的代码(实现向上翻页),其它超级链接代码跟此相类似。
4 结束语
ASP.NET查询分页技术是Web应用系统开发中经常遇到的重要工作,选择一种高效的查询分页技术,不仅能大大提高响应速度,而且能提高整个系统性能,节约服务器宝贵资源。
【编辑推荐】