ADO.NET 2.0 功能一览
SqlClient中特定于SQL Server 2005的功能
MARS
当您使用SQL SELECT语句(作为独立语句或者在存储过程内部)选择一个行集时,
SQL Server不会像某些数据库那样自动在该行集上产生游标。相反,它使用优化的方法
在网络中流式传输结果集,并且有时会在网络库以数据包大小的块拉入数据时直接从数
据库缓冲区中读取。这在SQL Server联机丛书中称为“SQL Sever的默认结果集”或“无
游标结果集”。在SQL Server 2005之前的SQL Server版本中,在单个连接上一次只能有
一个活动的无游标结果集。不同的数据库API和库将以不同的方式处理这个连接/无游标
结果集行为。如果您试图打开第二个无游标结果集,则ADO.NET 1.0和1.1会产生错误;
ADO“传统型”实际上会在幕后打开一个新的数据库连接。打开新的数据库连接更为方便
,尽管它不如产生错误那样“精确”;这个方便的功能已经被某些程序员在无意中滥用
,并且导致了比他们预料的更多的数据库连接。在SQL Server 2005中,数据库已经进行
了增强,以允许多个无游标结果集同时在单个连接上处于活动状态。这就产生了功能缩
写词“MARS”(多个活动结果集)。网络库进行了一些更改以支持该行为,并且新的网
络库和新的数据库都需要启用MARS。
在SqlClient代码中,您可以通过让多个SqlCommand实例使用同一个连接来多路复用
结果集。每个SqlCommand都可以容纳一个通过调用Command.ExecuteReader产生的SqlDa
taReader,并且多个SqlDataReader可以串连使用。在ADO.NET 1.0和1.1中,您必须先关
闭一个SqlDataReader才能获得另一个—即使使用了多个SqlCommand。请注意,您无法多
路复用从同一SqlCommand实例的多个ExecuteReader调用中产生的SqlDataReader。下面
是一个简短(但在功能上不是非常有用)的示例:
// connection strings should not be hardcoded
string connstr = GetConnStringFromConfigFile();
SqlConnection conn = new SqlConnection(connstr);
SqlCommand cmd1 = new SqlCommand(
"select * from employees", conn)
SqlCommand cmd2 = new SqlCommand(
"select * from jobs", conn)
SqlDataReader rdr1 = cmd1.ExecuteReader();
// next statement causes an error prior to SQL Server 2005
SqlDataReader rdr2 = cmd2.ExecuteReader();
// now you can reader from rdr1 and rdr2 at the same time.
该功能不只是与减少错误有关,也不只是为了阐明曾经的ADO库魅力,它与上述的异
步操作结合使用时,可能极为有用。多个异步SELECT语句或存储过程调用可以串连执行
,从而节省了数据库连接并优化了吞吐量。请想像一下使用单个连接在窗体上同时填充
20个下拉列表框。您还可以在结果集处于活动状态时执行无结果集返回语句。尽管同时
可以有多个执行流处于活动状态,但所有执行流都必须共享同一个事务(如果事务存在
的话)。事务仍然属于连接范围而不是命令范围。您可以通过像在以前版本的ADO.NET中
那样设置SqlCommand Transaction属性来将SqlTransaction实例与SqlCommand相关联。
SqlDependency和SqlNotificationRequest
在中间层缓存情况下,如果能够基于他人已经在数据库中更改某行的事实来刷新缓
存则极为有帮助。程序员已经借助于一些不同的技术来实现该目标,例如,编写在表或
视图更改时更新文件的触发器,或者无论数据库更改与否都经常刷新缓存。在SqlClien
t SqlNotificationRequest类和SqlDependency类出现之前,没有针对数据库通知进行注
册的简单方式。SqlDependency是一个高级别类,它包装了SqlNotificationRequest并且
将通知信息呈现为.NET事件。对于SqlNotificationRequest而言没有事件,您必须自己
完成注册通知以及获得信息的“繁重工作”。绝大多数程序员都将使用SqlDependency。
SqlDependency可以用作独立的类,并且在使用ASP.NET Cache类时可以直接使用它的功
能。这一特定于SQL Server 2005的功能取决于SQL Server Service Broker—它是一项
实现可伸缩队列系统的新功能。请注意,在使用ASP.NET Cache类时,应使用数据库轮询
而不是Service Broker来获得类似的功能。在使用Service Broker和SQL Server 2005时
,您不必为了获得通知而维护到数据库的连接。SqlDependency使用您选择的HTTP或TCP
协议,并且在基础行更改时与您联系。该通知不包含任何特定于行的信息,当您获得通
知时必须重新获取整个行集并重新注册该通知。该功能正是您对于单个缓存或有限的用
户组所需要的,但是当您对同时侦听的大量用户使用它时,请务必小心。当任一行更改
时,每个用户都必须刷新缓存中的整个行集。对于大量更改和大量用户而言,用于刷新
的SELECT语句可能会对数据库产生重大影响。
密码更改
SQL Server 2005提供了一种机制,以便使用与其他集成了登录的密码策略遵循同一
过期机制的SQL登录(连接到SQL Server的Windows登录),该功能要求SQL Server 200
5运行于Windows Server 2003上。如果SQL登录密码(例如“sa”)即将过期,则您将无
法使用传统的Windows机制和密码更改API来更改它。您只能使用最终调用Transact SQL
ALTER LOGIN的SQL Server客户端来更改该密码。SqlClient通过SqlConnection类上的
ChangePassword方法适应这一机制。请注意,该方法只有在针对SQL Server 2005实例执
行时才可用;尽管您可以在较旧版本的数据库上更改SQL登录,但该API使用的是其他SQ
L Server版本都不支持的网络数据包类型。密码更改的另一个需要考虑的方面是,在程
序的连接字符串中不再对SQL Server登录ID和密码进行硬编码。除非您将生成.NET中间
语言并在每次密码更改时都替换可执行文件(这不是一个可行的选择),否则必须在配
置文件中存储您的SQL Server密码。严谨的SQL Server开发人员已经在相当长的一段时
间内使用配置文件来存储(很可能是经过加密的)密码。更好的做法是始终使用SQL Se
rver集成安全性(如果可能)。
from:asp学习网/title:ADO.NET 2.0 功能一览/ time:2007-6-1 22:18:11
本文主题,NET