笔者从事网站制作的相关工作多年,从静态网站发展到动态网站的制作,技术逐渐成熟,针对目前网上发贴、提交评论信息、留言板等,用户互动栏目逐渐增多,提交的用户信息量逐渐增多,这时就需要管理好这些用户的信息,从而使用了数据库中的排序和索引,使得数据的检索速度加快,更方便用户的体验。
1 ASP. NET 概述
ASP. NET 是基于框架结构,并结合公共语言运行库( 提供各种不同语言的开发平台),能够在服务器端使用的 web 应用程序,它的功能非常强大,与之前的开发模型相比,它有许多的优势:
(1)性能进一步提升。ASP. NET 采用编译代码,将后台的页面生成 DLL 文件,这些代码是在服务器上运行的,代码采用公共语言运行库代码。
(2)广泛使用的的工具。ASP. NET Framework(框架)在VS 环境中使用了大量的工具箱和设计器,方便用户使用。
(3)功能强大且灵活。由于ASP. NET 基于多种语言的开发平台(公共语言运行库),所以,在实际应用中可以充分发挥各种语言的不同特点,从而实现相同的功能,提高了整个程序的灵活性,这是ASP. NET 的闪光点,在同一个环境中,可以针对不同的开发者。
(4)操作简单。ASP. NET 从配置数据库开始,到 MVC 数据类库的使用,再到数据的提高等都变得十分简单,容易操作。
(5)数据库的索引。关系数据库,是一种使用较为广泛的数据结构类型,它可以使表中的语句执行得更快,当数据库中有许多记录时,一般的搜索就是进行全表搜索,把记录全部取出来,再与查询条件进行对照,最后再返回满足条件的记录,这样操作对于数据库的资源造成很大的消耗,造成大量I/O 操作;如果采用索引就可以很好的解决这些问题,在相关的表中建立索引文件,然后在索引项目中查找符合查询条件的记录,最后在表索引的行集合中找到符合条件的记录。
2 留言板中的排序和索引
ASP. NET 中,留言板中记录的排序是一个非常复杂的内容,在排序的过程中还涉及到分页、分级的索引以及排序。如果按照升序排序,代码如下:
源代码:
< asp:Repeater ID = “ rep” runat = “ server” On Item Data Bound = “ rep-Item Data Bound” >
< Item Template >
< table width = “ 100% ” border = “ 1” class = “ gb-table” >
< tr >
< td > 第< asp:Literal ID = “ lit X” runat = “ server” > < / asp:Literal > 条< / td >
< / tr > < / table >
< / Item Template >
< / asp:Repeater >
/ / 循环列表事件
int x = 0;
protected void rep-Item Data Bound(object sender,Repeater Item Event Args e)
{
if (e. Item. Item Type = = List Item Type. Alternating Item | | e. Item. Item Type = = List Item Type. Item)
{
Panel pnl Replay = e. Item. Find Control(“pnl Replay” )as Panel;
Literal lit Replay = e. Item. Find Control(“lit Replay” )as Literal;
if (lit Replay. Text. Trim() .Length = = 0)
{
pnl Replay. Visible = false;
}
else
{
pnl Replay. Visible = true;
}
Literal lit X = e. Item. Find Control(“lit X” )as Literal;
lit X. Text = (Anp. Start Record Index + x)。To String();
x + + ;
}
}
结果是 1,2,3,4,5…依次进行升序排序,这是我们经常见到的排序方法,即顺序排列。
但我们平时的留言,是有时效性的,最近的留言是置顶的,即留言板实际的情况是降序排列,即6,5,4,3,2,1,这样就需要得到这样的结果:
这里需要用到数学的计算方法,将降序排列的数依次减去升序排列的数,然后在此基础上加一,这样就得到了我们的降序排列。
/ / 循环列表事件
最终的结果变成:
int x = 0;
protected void rep-Item Data Bound(object sender,Repeater Item Event Args e)
{ //绑定控件
if (e. Item. Item Type = = List Item Type. Alternating Item | | e. Item. Item Type = = List Item Type. Item)
{
Panel pnl Replay = e. Item. Find Control(“pnl Replay” )as Panel;
Literal lit Replay = e. Item. Find Control(“lit Replay” )as Literal;
if (lit Replay. Text. Trim() .Length = = 0)
{
pnl Replay. Visible = false;
}
else
{
pnl Replay. Visible = true;
}
Literal lit X = e. Item. Find Control(“lit X” )as Literal;
lit X. Text = (anp. Record Count - (anp. Start Record Index + x)+1)。To String();
x + + ;
}
}
3 商品浏览页面的排序和索引
商品的上一页、下一页、返回这三个按钮,不能简单的按照商品的 ID 号加1 或者是减1 进行排序,因为商品的 ID 号并非是连续的(ID 为自增,商品的 ID 有可能进行增加或删除操作,导致 ID 号不连续,并且删除掉的 ID 号不能再填充到ID 中,ID 会出现断层)。比如:当前商品的 ID 号是12,上一页的商品 ID 号并非是11,下一页的商品 ID 号并非是13,这个时候用到 SQL2005 以上版本支持的Row_Number 函数,也就是在原有的数据库的基础上再多加一列,SQL 语句为:
select ROW_NUMBER() over (order by createdate desc)as rowid,* from shop-prodect
取值时,根据当前商品的ID 号,取出 rowid 的值,SQL 语句为:
Select rowid from (select ROW-NUMBER() over (order by createdate desc)as rowid,* from shop-pro-dect)as a where a. ID = 12
得到的结果是 rowid = 5,在查找当前的 id = 12 时,找到它对应的 rowid 值为5,这样就使得 rowid 的值是连续的,不会因为增加,删除id 的值而出现断裂号。
综上所述,无论是在商品页中的商品浏览的顺序,还是在制作留言板的时候,我们都不仅要考虑到分页以后的排序,还要考虑到发表的最近的评论放在首条。只有充分考虑到这些实际的应用,然后结合数据库中的数据排序的使用技巧,才能得到最新的商品及对于某一件商品的评论。
本系统采用了关系型数据库,对测试的数据进行了大量的实验和分析,在数据库的完整性、安全性、并发性、效率以及兼容性方面进行了测试,确保数据的运行稳定,进一步加深了对SQL 语句方面的知识的应用,对比了不同 SQL 的版本,以及各个版本之间存在的兼容性问题进行了详细的对比、分析。
参考文献:
[1] 国家863 中部软件孵化器。 ASP. NET 从入门到精通[M]. 北京: 人民邮电出版社,2015.
[2] 饶志坚,缪祥华。 Web 程序设计技术( ASP. NET) [M]. 北京: 中国林业出版社,2015.
[3] ( 美) 加洛韦,等。 ASP. NET MVC 5 高级编程( 第 5 版) [M]. 北京: 清华大学出版社,2015.
[4] 斯蒂芬森( Ryan Stephens) ,等。 SQL 入门经典( 第 5 版) [M]. 北京: 人民邮电出版社,2011.
[5] 张静,基于 ASP. Net 的教育服务平台设计与实现[D]. 北京: 北京工业大学,2011.
[6] 卢军,陈建军,谭佐军,谢静。 基于ASP. NET 和SQL 的大学物理实验选课系统设计[J]. 大学物理实验,2011,24( 1) : 89 -92.