ADO.NET的开发场景及传统ADO的处理

ADO.NET的开发场景及传统ADO的处理,第1张

ADO.NET的开发场景及传统ADO的处理,第2张

当你切换到ADO.NET时,你将需要知道如何处理那些你过去知道如何用ADO处理的场景,但是现在你必须用ADO.net来解决。就像用Visual Basic、C++和ASP开发的N层解决方案往往依赖ADO来满足数据访问需求一样,Windows?表单、Web表单和Web服务也依赖于ADO.NET。我曾经从传统ADO开发的角度讨论过如何使用ADO.NET处理一些数据访问场景。其中一些主题包括将行集保持为XML、仅处理传入的水游标以及执行命令对象的各种方法。在本文中,我将继续讨论使用ADO.NET的开发场景,以及如何使用传统的ADO技术处理它。我将从常用的传统ADO的只进、静态、键集和动态游标的情况开始。我还将讨论如何处理并发性,以及不连接的行集是如何从ADO发展到ADO.NET的。然后,我将解释如何将使用传统ADO处理批量更新的代码转换为使用ADO.NET的代码(使用DataAdapter及其四个命令对象)。

分散记录集的功能

在ADO.NET中,ADO记录集的大多数函数被分为三个主要对象:DataReader、DataSet和DataAdapter(见图1)。


图1 ADO记录集

ADO.NET DataReader对象被设计为服务器端的只进只读游标。ADO.NET数据集对象是断开连接的行集的存储工具。它存储记录,但不保持与数据源的连接。事实上,它并不关心它的行集来自哪个数据源。DataSet存储在内存中时是一个二进制对象,但它可以很容易地从XML序列化为XML。当此ADO记录集对象与其关联的Connection对象断开连接(通过记录集的ActiveConnection属性)时,将CursorType设置为adOpenStatic,将CursorLocation设置为adUseClient是类似的。ADO.NET DataAdapter对象是连接和DataSet对象之间的桥梁。它可以通过连接从数据源加载数据集,并用数据集中存储的已更改内容更新数据源。ADO记录集的行为取决于其属性的设置(包括CursorType和CursorLocation属性)。在ADO.NET,不同的对象被构建来处理这些特定的情况,而不是使用一个对象来处理所有的情况。

流动光标

传统的ADO公开了四种不同类型的游标,可以改变ADO记录集对象的操作模式。由于其CursorType属性的不同设置,ADO记录集对象的行为可能会有很大的不同。例如,通过将CursorType设置为adOpenForwardOnly,Recordset可以保持与其数据源的连接,并且必须以只进的方向遍历它。但是,当您将CursorType属性设置为adOpenDynamic时,记录集可以向前或向后遍历,甚至使光标跳转到特定的行。通过其CursorType和CursorLocation属性,ADO记录集对象采用了一种将许多解决方案包装到单个对象中的方法。adopted采用的方法不同。它设计不同的对象和方法来处理各种具体情况。在传统ADO中,通过将CursorType设置为adOpenForwardOnly,将CursorLocation设置为adUseServer(这也是默认设置)来实现只进和只读游标,这将使Recordset对象采取只进服务器端游标的形式。MoveNext方法将记录集重新定位到下一行,而MovePrevious方法是完全不允许的,但您可以调用记录集的MoveFirst方法。这有点误导,因为此方法不会将记录集重新定位到当前行集的开头。相反,它调用原始SQL语句并从头开始重新填充记录集,因此它再次移动到第一条记录。每次执行传统ADO记录集的MoveFirst方法(CursorType设置为adOpenForwardOnly)时,通过打开SQL事件探查器工具并观察SQL的执行,可以很容易地看到这一点。当您需要逐个遍历数千(甚至更多)行中的每一行时,或者当您需要一个较小的行集,但只需要遍历一次(可能是为了将其加载到一个选择列表中)时,这种游标非常常见:

ASP和ADO
集合or中的只进消防软管光标。ActiveConnection = oCn
oRs。lock type = adLockReadOnly
oRs。cursor type = adopenforwardlonly
oRs。cursor location = aduse server
oRs。打开sSQL

与这种传统的ADO运行游标最相似的是ADO.NET DataReader对象。与传统的ADO记录集一样,DataReader在打开时保持与其数据源的连接,并且只能向前遍历。然而,它们之间存在差异。一个区别是它是专用于某个数据提供者(比如SQL Server?(SqlDataReader类)或ODBC数据源(OdbcDataReader类))。ADO.NET DataReader对象非常高效,因为它是专门为只进和只读游标而构建的。ADO的传统只进游标是由同一个Recordset对象实现的(作为一个断开连接的Recordset,甚至是一个数据源敏感的Recordset)。DataReader仅设计为轻量级运行游标。

//-c#中的ASP.NET和ADO.NET
SqlDataReader oDr = oCmd。ExecuteReader();

数据敏感光标

ADO的传统只进游标现在由DataReader对象处理。但是对底层数据库的变化非常敏感的键集和动态服务器端游标(CursorType = adOpenKeySet和CursorType = adOpenDynamic)怎么办?ADO.NET的当前版本不公开多方向、可滚动和可更新的服务器端游标。然而,ADO.NET确实提供了许多方法来避免使用这些类型的服务器端游标,因为还有其他推荐的技术可以考虑。除了使用DataSet结合DataAdapter来检索和更新数据之外,还有一些在客户端使用可滚动的服务器端游标的好方法。例如,您可以使用存储过程,这在运行服务器端SQL处理时非常有效。还可以使用DataReader通过服务器端只进游标检索数据,然后用Command对象更新数据。但是,通常有比使用可更新的服务器端游标更有效的方法来修改数据。

在N层环境中,服务器端可滚动游标的一个问题是它们需要在服务器上保持状态。因此,如果应用程序在中间层使用服务器端可滚动游标,则客户端层需要维护与可滚动游标所在的业务层的连接。这样,在使用可滚动光标的客户端应用程序屏幕存在期间,需要保留业务对象。这些可伸缩性问题在各种文档中都有很好的记录。但是,在某些情况下,服务器端游标仍然很有价值,比如只需要流水游标的情况。例如,当应用程序需要关注数据并发时,就使用服务器端游标。使用传统的ADO,可以用动态光标打开记录集,这使得记录集能够知道其他用户执行的所有插入、更改和删除操作。这种服务器端游标对其他用户所做的更改非常敏感,可用于在应用程序出现并发问题时采取主动措施。例如,传统ADO中的动态游标通常用于应用程序准备将更改保存到数据库中的情况,但有必要确保它首先知道其他人是否更改了相同的记录。当用户更改动态记录集中的记录值时,该值将在服务器端动态记录集中自动更新:

ASP和ADO
Set oRs中的动态游标。ActiveConnection = oCn
oRs。lock type = adlock optimistic
oRs。cursor type = adOpenDynamic
oRs。cursor location = aduse server
oRs。打开sSQL

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » ADO.NET的开发场景及传统ADO的处理

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情