|
到 |
目前为止,本书中处理的都是行集中的数据。这往往与更加过程驱动的语言处理事情的方式相反。实际上,当客户端访问数据时,总是必须要通过行集获取并逐行地处理。这就必须涉及游标。的确,甚至在传统的SQL Server工具中,当使用基于CLR的语言支持的脚本时,如果在其中利用了非面向SQL的语言,就会涉及某种游标模式。
在本章中将讨论:
l 什么是游标;
l 游标的生命期;
l 游标的类型(敏感性和可滚动性);
l 游标的使用。
我们会发现,在创建游标时,有许多要考虑的地方。
或许,在创建游标时,最需要考虑的事情是,“是否有办法避免使用游标?”如果每次准备创建游标时都问自己这个问题,那么,你就是在向性能更好的系统而努力。话虽如此,有时我们别无选择,还是不得不使用它。
15.1 什么是游标
游标是取用一组数据并能够一次与一个单独的记录进行交互的方法。它几乎不会如想象的那样很经常地发生。然而,有时,确实不能通过在整个行集中修改或者甚至选取数据来获得所需要的结果。行集是由所有行共有的一些东西产生(通过SELECT语句定义),但是,接下来需要逐一处理这些行。
放入游标中的结果集有几个显著的特征,这使得它们有别于标准的SELECT语句:
l 声明游标与实际执行游标是分开进行的;
l 在声明中命名游标,因而也命名了游标的结果集——然后通过名字来引用它;
l 游标中的结果集一旦打开,就会一直保持打开,除非你关闭了它;
l 游标有一组专门的命令用来导航记录集。
虽然SQL Server有其自身的引擎处理游标,但是,实际上一些不同的对象库也能在SQL Server中创建游标:
l SQL Native Client(由ADO.NET使用);
l OLE DB(由ADO使用);
l ODBC(由RDO、DAO以及一些情况下由OLE DB/ADO使用);
l DB-Lib(由VB-SQL使用)。
客户端应用程序使用这些库来访问单独的记录。每一种都提供其特有的导航记录集的语法,或者管理游标的语法。尽管如此,每一种都有共同的一组基本概念,因此,一旦得到了游标的一个对象模型,对于它们全部而言,就几乎完成了一大半的事情。
所有的数据访问API(ADO.NET、ADO、ODBC、OLE DB等)都在游标中向客户端应用程序或组件返回数据——这是非SQL编程语言当前处理事情唯一的方式。这也是这种类型的游标与SQL Server游标之间极大差异的来源。使用SQL Server游标时,通常可以选择像行集操作一样执行,行集操作是SQL Server被设计来做的事情。使用基于API的游标时,全部所有就是游标,因此,在服务器端的活动中,不再有同样的游标与非游标的争论。
数据处理中客户端的部分将使用游标来完成——那只是个假设,因此不必担心。相反,要担心的是使服务器端的数据访问尽可能高效——意味着如果能够处理,则在服务器端尽量不使用游标。






