概念
游标 cursor是对以前查询结果一条一条记录处理的机制。
查询select的结果是一个视图,也是一条条地从数据库/视图提取出来的,呈现在用户面前时是个二维关系表,用户无法直接再一条一条地处理。
例:要把第一个同学的姓名改为张三四,把三个同学的生日提前3天,把第四个同学的身高减少1厘米。老办法,使用个独立不相干的UPDATE命令实现,如果是前后台的软件,连接操作数据库三次,效率特别低。如果使用游标,一次操作就完成,而且如果再在过程中使用游标,效率是最高的,前后联系,消息传递一次搞定。如果使用游标来解决上面问题,游标是数据库管理系统内部的操作,与第三方其它语言无关,在过程代码中实现,可动态操作数据,保证实时性。
实例:如前台输入姓氏,后台使用C#查询该姓的所有人,再把查询的这些的人的姓名,性别,生日,身高返回给前台展示.
(1) 直接使用C#的服务器控件,通过文本框输入姓氏,c#连接数据库sqlserver实现查询,把查询结果放在datase
t中,再从dataset
去读取记录行,最后response.write
输出到前台的浏览器中.
(2) 前台使用纯html控件文本框,输入姓氏后,把姓氏值以ajax方式提交到后台,使用C#后台程序去连接数据库实现查询,把查询结果放在dataset中,再从dataset中读取记录行,把这些记录行凑成一个以指定字符间隔的字符串或集合JOSN,再以ajax不刷新方式传输给前台。前台ajax接收到数据,再拆开这些数据,显示在浏览器。
(以上两种方法,后者是使用html+jquery+ajax+sqlserver+c#/java方式,整个过程是不刷新,效率比较高。前者使用C#+sqlserver,效率较低,重复加载/显示数据时要刷新,的有服务器控件到达前台时要转换为HTML控件再显示在浏览器中。(后台的文本框控制textbox1,它要显示在用户端浏览器时要转换为html控件<input type='text'>
(3) 最理想的方法,目前较流行的方法:前台使用纯html控件文本框,输入姓氏后,把姓氏值以ajax方式提交到后台,使用C#后台程序去连接数据库实现查询.在sqlserver中编写一个过程/函数,接收姓氏值,在过程中使用游标,去访问该姓名的所有人,把这些人的姓名,性别,生日,身高数据连接成一个串,最后把结果串返回给调用处。如果使用datareader,连dataadpater都不要了. 然后C#把这个长的串ajax方式回传给前台,前台再来拆分这些数据和显示出来.
此法目前比较优化的,最麻烦的工作是前台浏览器和sqlserver中,C#/JAVA负担相对轻得多,更适合编写实时效率要求高的软件。此法有一个最大特点:用户端见的东西是纯HTML,不需要控件在C#与HTML相互转换,前台浏览器的内容改变也不会自动刷新,
游标是对查询结果逐条操作,主要包含两个方面的内容:
(1)游标结果集:它就是对应select命令产生的视图(结果集)[有点类似于早期学的C#中的datareader
,也是记录集概念]
(2)游标当前指针:游标指针初始是指向结果集的首行,指向哪一行就可以操作哪一行,而且可以随意拔动指针到指定行,支持对当前行进行数据读和写的。
可见,以前datareader
, dataset
中很多操作可以使用游标来完成的。
游标使用过程
引例:编写一个函数,使用动态游标返回李大方的性别和生日,不允许通过游标修改任何数据。
create function getbirth1() returns varchar(50)
as
begin
declare @birth smalldatetime,@sex nchar(2),@result varchar