收藏 分享(赏)

ado net入门教程.doc

上传人:11xg27ws 文档编号:7806250 上传时间:2019-05-26 格式:DOC 页数:8 大小:164.50KB
下载 相关 举报
ado net入门教程.doc_第1页
第1页 / 共8页
ado net入门教程.doc_第2页
第2页 / 共8页
ado net入门教程.doc_第3页
第3页 / 共8页
ado net入门教程.doc_第4页
第4页 / 共8页
ado net入门教程.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

1、ADO.NET 将成为构建数据感知 .NET 应用程序的基础. 不同于 ADO 的是,ADO.NET 更具有通用性,不是那么专门针对数据库而进行的设计. ADO.NET 聚集了所有可以进行数据处理的类.这些类呈现了具有典型数据库功能的 data container objects,比如:索引,排序,浏览.尽管 ADO.NET 是作为重要的.NET 数据库应用程序的解决方案,它更多的显示了涵盖全面的设计,而不仅是作为和 ADO 模型一样的以数据库为中心。.ADO .NET 与 ADO 有很大的不同.它是一个全新的访问编程模型.当你开始使用 ADO.NET 时,你会发现你所掌握的任何关于 ADO

2、的技能在搭建有效的程序以及解决难题方面对你都会有很大帮助,能够帮你在解决问题上朝更灵活更稳妥的方向发展.ADO.NET 不是 ADO 为适应.NET 基础构造而进行改进的版本.当你慢慢了解了 ADO.NET 的语法,代码设计以及移植后,你就会清楚了.1.NET 中的数据访问访问 ADO.NET 中的数据源是由托管提供程序所控制. 虽然托管提供程序与 OLE DB 有两处重大的不同,但是二者是极为类似的.首先, 托管提供程序在.NET 环境下运行,通过 DataReader 和 DataTable .NET 类来检索和展示数据.第二,它们的体系结构都比较简单,是因为为了适应.NET 而进行了优化

3、.此时,ADO.NET 分成两种不同类型的托管提供程序:一种用于 SQL Server? 7.0 或更高版本,另一种适用于所有你可能已经安装的 OLE DB 提供程序.虽然运用在两种托管提供程序中的类是不同的,但它们却都遵循相类似的命名方式.除开前缀之外,其它名称都是相同的.前一种情况前缀为 SQL, 后一种则是 ADO.你需要利用 SQL 类来访问 SQL Server 表,因为 SQL 类会跳过由 OLE DB 提供程序呈现的中间层, 而直接进入数据库服务器内部 API. ADO 类是位于 OLE DB 提供程序顶端的.NET 接口,利用 COM Interop 桥来进行工作.关于 ADO

4、.NET 的入门知识,你可以读读 Omri Gazitts 的文章,文章里主要介绍了 ADO+:关于微软NET 框架的数据库访问服务(Data Access Services),而我的文章里关于 ADO+的论述主要指出了数据种类的进化.前者更纯技术化,并提供了更高水平的关于 ADO.NET 编程模型的概述。后者主要是解释 ADO.NETR 的目标,以及它与 XML,脚本及其它技术的联系.2.读取数据ADO.NET 应用程序要从数据源里读取数据,首先得创建一个连接对象.这个连接对象可以是 SQLConnection 或是 ADOConnection,这取决于所采用的目标提供程序. 需要记住的是,

5、虽然在这里不做推荐,但你也可以利用 ADO .NET 类来连接到 SQL Server 数据库. 这种方法唯一不足是,代码需要通过一个不必要的额外代码层. 首先它会调入 ADO 的托管提供程序, 然后 ADO 的托管提供程序再调用 SQL Server OLE DB 提供程序. 如同 OLE DB 提供程序做的一样,SQL Server 托管提供程序会直接操作数据,关于 ADO 和 ADO.NET 在连接对象上最大的差别在于 ADO.NET 连接不支持 CursorLocation 属性.与其说这是一个文档 BUG,还不如认为这是一个备具争议的设计问题.为强制执行它的以数据为中心的基准,ADO

6、.NET 没有游标的显示实现.在 ADO 中,你已习惯于利用游标将记录从数据库或其它 OLE DB 兼容的数据源中抽取, 你可以选择客户端或是服务器端游标,每种游标都有几个预先设定的游标类型. 而在 ADO.NET 中更多的是从数据源中抽取数据,并且为读取和分析数据提供新的编程接口在 ADO 中,通过规定连接和命令文本,你可以创建一个 Recordset 对象.对于游标的位置和类型 Recordset 有一些规定.你可以按下面的方法来读取数据.在内存中创建选定记录的静态副本,然后在断开与数据源的连接时对副本进行处理,ADO 称之为静态游标.通过快速的, 仅向前的, 只读游标来滚动数据,ADO

7、称之为仅向前游标.通过服务器端游标来访问数据,需要良好的连接,但您可以在不同层面上检测由其它连线用户输入的信息,ADO 称之为: 动态游标.头两种都是在断开的 recordsets 上进行操作,并从客户端缓存中读取信息,另外,前两种方式也常被用于面向 WEB的环境中以及全新的 n-tier 系统当中.在 ADO 中,以上所有这些方式与不同类型的游标相对应 .在文中,你将会发现,ADO.NET 虽然与 ADO 不同,但它具备了ADO 的所有功能.相对照来说,你的代码将从实际的数据源及其物理存储媒介和格式中抽取数据.ADO.NET 能够使 DataSet 和 DataReader 将数据从数据源中

8、抽取出来.前者是记录在内存中的缓存,你可以从任意方向访问并随意作出修改. 后者是高度优化的对象,在只读纪录集中以仅向前方式向前移动。注: DataSet 看起来象是静态游标,但实际上,在.NET 中,与 ADO 只读游标相对应的是 DataReader 对象.在 ADO.NET 中,虽然对于服务器端的游标不提供任何支持,但这不意味着你就不能使用游标.实际上,你所需要做的步骤是在.NET 中输入 ADO 库.你只需在 references node 上单击右键,就可以在你自己的程序里运行本地 ADO 对象.但是我个人认为,在你想转向.NET 时,请慎重考虑. 首先,请务必完全输入 ADO, 这不

9、会花费太多时间和精力,这是向.NET 迈出的第一步,.但是,这仅仅是万里长征的第一步而且也是通向.NET 必须的一步. .NET 的真正附加值是基于一个均匀的,持续稳定的接口以及本地 classes 的广为应用之上的.关于 COM libraries 是可以被支持的,合理的,但不被鼓励的,因为它仅仅是个短期解决方案,或者是一个过渡步骤.当你要开始使用 ADO.NET 时,请考虑这样一个事实:ADO.NET 统一了数据容器类编程接口,.因此,不管是何种类型的程序: Windows Form, Web Form, 或者 Web Service 也好,你都得在同一组类中集中处理有关数据. 不管处于后

10、端的数据源是 SQL Server database,或是 OLE DB 提供程序, XML 文件,又或是数组,你都可以使用一样的方法和属性来进行处理.Figure 1. Solution Explorer menu 如果你坚持在.NET 世界中使用 ADO,那么请准备好面对一些其它的影响,例如你需要额外的代码才能够从数据绑定控件中使用 recordset.3.DataSet, DataTable, and Recordset关于 Recordset object.,ADO.NET 并没有与其直接相对应的对象.最接近的是 DataTable 对象.虽然它们二者几乎具有相同的功能,但它们在各自的

11、框架里发挥着不同的作用.Recordset 是一个相当大的对象,具备 ADO 的大多数功能,但在某些方面仍有欠缺. Recordset 在一些方面性能优良,如:它具可创造性,它可以离线操作,功能众多,但在一些方面仍需改进,如:基于其固有的 COM 特性, Recordset 很难在网络上连载; Recordset 是一个二进制的对象,因此不同平台之间的模块很难共享它;还有就是蛇不能够穿过防火墙.另外,它表现的是记录的单个表.如果该 table 作为一个或几个 JOIN 的结果,那么它很难更新原始代码源.当你试图将脱线的recordset 与原始代码源统一起来时,数据源必须能够识别 SQL.不管

12、如何,你的 recordset 可以由非 SQL 提供程序创建.在 ADO.NET 中,ADO Recordset 的所有功能被分拆成几块更简单的对象:其中一个便是 DataReader. DataReader 模拟了快速,只读,仅向前的只读游标的操作.DataTable,表现了数据源,是个简单的对象. 你可以手动构造一个 DataTable,或者也可使用 DataSet 命令自动生成. DataSet 对于它所包含的数据知之不多.通过它,你可以在内存中处理数据,或者是其它比如排序,编辑,筛选,创建浏览等工作.DataSet 对象是一个数据容器类,是实现 ADO.NET 数据抽取的关键对象.

13、DataSet 集合了一个或几个 DataTable 对象. DataTable 通过如行,列这样的通用集合,公开自身的内容.当你尝试从数据表读取数据时,你也许正穿过了两个不同的层面: DataTableMapping 和 DataView.DataTableMapping 对象包含了数据源中的数据列,以及 DataTable object 之间的映射关系.当填充 DataSet 时,DataSetCommand 对象要使用这个类。它维护数据集中的抽象列和数据源中的物理列之间的链接。表的视图通过 DataView 对象实现。它表示 DataTable 的自定义视图,可以绑定到特定控件(如 Wi

14、ndows 窗体和 Web 窗体中的数据网格)中。该对象相当于 SQL CREATE VIEW 语句在内存中的实现。DataSet 中所有的表,通过一个公共的域,相互之间能产生关联.它们之间的联系是由 DataRelation 对象来进行管理.这样说起来挺象 ADO 的数据形成,但还是有一个最大的不同.在 DataRelation 里,你不需要使用数据形成语言,而且还可以获得非常灵活的组织架构. 通过 ADO .NET 导航模型,你可以很容易的从某一张表中的主行移动到它的所有子行里.DataRelation object 是关于 JOIN 语句在内存中的实现,可用于建立数据类型相同的的 par

15、ent/child 关系,. 一旦关系确立,任何破坏这种关系的修改都被禁止. Views 和 relations 是完成 master/detail 架构的两个方法.请记住view 仅是加载于记录之上的掩码, 但是 relation是位于几个列之间的动态链接,在 relation 下,你无法更改顺序或是设置条件.如果你的代码需要 1 对 1 的外键关系,而且更改数据,最好不用 JOIN 命令.如果你需要额外的筛选功能,你可以寻求ADO .NET 自定义视图的支持.4.转换现有代码大量的 ASP 页面使用 ADO 对象来抽取数据.让我们一起来回顾下几例典型的案例,对你在以后处理移植或者改写代码时

16、也许会有帮助。如果你有从单个 recordset 生成报表的 ASP 页面,那么 DataReader 会是你的好帮手。String strConn, strCmd; strConn = “DATABASE=MyAgenda;SERVER=localhost;UID=sa;PWD=;“; strCmd = “Select * From Names where ID=“ + contactID.Text; SQLConnection oCN = new SQLConnection(strConn); SQLCommand oCMD = new SQLCommand(strCmd, oCN); o

17、CN.Open(); SQLDataReader dr; oCMD.Execute(out dr); while (dr.Read() / Use dr.GetString(index) or / dr“field name“ to Response.Write data你可以利用 HasMoreRows 属性来快速检查是否 DataReader 为空.如果你仅仅只简单处理一系列记录,没有什么比DataReader.更快,更好的对象了,它同样适用于查询单个记录。DataReader.的内容是不可编辑的,但你可以将内容移动到更具管理功能的对象里,如:DataTable 或是一个或多个 DataR

18、ow 对象.当你需要处理表与记录二者之间的复杂关系时,DataReader 就不是合适的工具了。数据模型链接越多,SQL 命令则会越复杂。导航模块保有连续性,最后放入缓存的数据往往多于你所需要的,. DataSet 和 DataRelation objects 是这种表关系模型的基础.为管理 parent/child 关系,ADO 同样也对 data-shaping engine 进行封装. 总的说来, data shaping 和 ADO .NET 关系是一回事.就设计方面来说,二者几乎没有共同点. Shaped recordsetsct 嵌入列表对象中包括了所有数据表信息。ADO.NET

19、关系是动态链接,你可以在两个数据表间随时建立. ADO 依靠于 Shaping OLE DB service 提供程序,并使用专门的 SQL 类语言特征以在执行单个 ADO 命令的过程中生成一个分层的 recordset.在 ADO.NET 中,关系中涉及的每个对象总是被看成单独的个体。关系本身作为对象被公开,并且具有一定的行为规则。例如,DataRelation 对象可以从父行到子行一层层进行更改。您可以通过将 ForeignKeyConstraint 对象添加到 DataTable 的 Constraints 集合中来进行此操作。ForeignKeyConstraint 对象表示当删除或更

20、新数值和行时,对通过外键关系相关联的一组列的约束。如前面提到的,一旦设置好了关系,在它按程序预设终止之前,您不能进行可能破坏该关系的更改。正如早先提到的一样,一旦设置了 relationship,除非它是程序性的终止,你不能够对它进行修改,那样会使它突然中断.另外, relations 没有递延性.你可以在 Customers 和 Orders 之间,Orders 和 Products 之间设置两个不同的关系.但是,当为了某个 customer 而对 orders 导航时,你不能够从一个 order 跳到相关的 products 行.解决方法是,你必须另外打开 Orders/Products

21、关系,锁定你需要的 order,然后获取相关的行.程序员需要在 ASP Session 对中存储记录吗?通过 ADO .NET 和 DataSet 对象,你可以非常安全的进行工作,而不会引起在“Storing an ADO Recordset in GIT Might Cause An Access Violation“中所论及的麻烦.5.更新数据Web 程序通常利用无程式语句或者通过参数代存储过程来更新数据.但是,当遇见脱线的数据时,你也许希望利用内置服务来更新所有需要修订的记录.为完成这一工作.ADO 提供了成批的更新机制.UpdateBatch 方法用于把保存在副本缓冲中的 Record

22、set 更改发送到服务器,以更新数据源。它采用开放式锁定,允许所有挂起的本地更改。它还在单个操作中把所有更改传送到数据源。仅当更改提交后数据源锁定要更改的记录时,才会出现开放式锁定。开放式锁定使两个用户可以同时访问同一个记录,但一个用户输入的更改很快会被另一用户所覆盖。当然,这种方式要求数据源能够检测和防止数据冲突。还要求整个数据源比较稳定,不会发生频繁的更改。否则,不难想象协调费用将很快超过替代严格锁定所带来的节约。事实上,使用 UpdateBatch 方法,在任何更改失败时都会返回一个错误。然后,您可以通过 Errors 集合和 Error 对象来访问该错误。要理解 ADO.NET 模型为

23、什么是更新数据的更强大的工具,理解 ADO 中开放式锁定的工作原理是非常关键的。在 ADO 代码中,您无法控制调用 UpdateBatch 之后所发生的一切。也就是说,更新是在服务器上通过滚动已更改的行,然后比较原始值和数据源中对应记录中的当前值来进行的。当所有的值都一致了,才对表执行适当的 SQL 语句(INSERT、UPDATE 或 DELETE)。以上陈述说明了你还不能够控制 SQL 语句。位于服务器端的更新 代码既不会比你自己写的好,也不会在你采用的非 SQL 提供程序的情况下运作。在本章节的开始部份,我已经讲了 Web 应用程序是典型的通过参数化存储进程来更新数据的过程。不管如何,如

24、果你用批更新,情况就会有所不同.在 ADO.NET 中, 模型已被扩展开来.现在,它采用更为通用的架构,通过它你可以规定你自己关于基本运算的命令语句,如插入,删除,更新以及选择. 更明显的,你可以观察到从数据源里提取数据的企图,并且不管数据源的本性,可以提供相同的支持.ADO.NET 中的批更新,要求你创建一个 DataSetCommand 对象: SQLDataSetCommand 或者ADODataSetCommand注: 在 Beta 2 中, DataSetCommand 对象被称为 DataAdapter 对象.一旦你采用了 DataSetCommand 对象,你可以使用它的 Upd

25、ate 方法. DataSetCommand 提供了一系列属性:如InsertCommand, DeleteCommand, UpdateCommand, and SelectCommand.它们都是 Command 对象,但你不能够对它们进行设置,除非缺省设置没有按你的要求完成.这与 ADO 中一样.在 Update 过程中,如果没有设置 xxxCommand 属性,但是主关键字已经存在内,则会自动生成 Command 对象.以下代码展示了如何为 EmployeesList table 设置主关键字,DataColumn keys = new DataColumn1;keys0 = m_oD

26、S.Tables“EmployeesList“.Columns“EmployeeID“; m_oDS.Tables“EmployeesList“.PrimaryKey = keys;主关键字基本上是是 DataColumn 对象的一个数组.如果你想利用存储过程来更新表单,或者你利用专用非 SQL 数据提供程序进行操作,那么你将会常常用到这 些命令属性.6.XML 的延展支持功能在 ADO 中,XML 仅仅只是作为输入和输出格式.但是,在 ADO.NET 中,XML 作为数据记录格式为你提供了一系列的方法,如:manipulating, reorganizing, sharing, and tr

27、ansferring. 任何你输入进到 DataSet 中的数据,不管是不是原创,都能够通过双面编程模型进行处理.如同 XML 文档一样,DataSet 读取/书写数据和模式。数据和模式在 HTTP 中是可转移的,也可以在任一支持 XML的平台上运行。相同的数据在不同的时间段通过不同的模式可以被执行。你利用 ReadXmlSchema 来书写模式。 XML 模式包含了 data set 中 tables 的名称,如同 data set 中的 relations 和 constraints 一样。在调用 ReadXmlData 之前你应该完成这个步骤以下代码示例是一个显示可更新数据表的最简单的

28、ASP.NET 页面。% Import Namespace=“System.Data“ % Import Namespace=“System.IO“ %script runat=“server“ language=“C#“void Page_Load(Object source, EventArgs e)DataSet data = new DataSet();/ Loads XML data and schemaStreamReader sr;sr = new StreamReader(Server.MapPath(“data.xml“);data.ReadXml(sr);sr.Close(

29、);/ Add a new record passed through the URLif (Request.QueryString.Count 0)DataTable dt = data.Tables0;DataRow dr = dt.NewRow();dr“FirstName“ = Request.QueryString“First“;dr“LastName“ = Request.QueryString“Last“;dt.Rows.Add(dr);dt.AcceptChanges();StreamWriter sw;sw = new StreamWriter(Server.MapPath(

30、“data.xml“);data.WriteXml(sw);sw.Close();/ Refreshes the UI (made of a grid)grid.DataSource = data.Tables0.DefaultView;grid.DataBind();/script如图 2 所示,您可以将新的行添加到表中。然而,它不涉及 SQL Server 或 Access 表。它只是一个 XML 文件,在处理它的代码中,没有使用 XML 节点或 XMLDOM 方法。您可以用相同的直观数据表接口来读取和更新 XML 记录。您的工作方式与在 ADO 中大致相同,但此处的模型更深入、更庞大,有

31、更多的潜力供您去发掘。Figure 2. Example of an updateable table 7.结论Web 应用程序的成功改变了典型分布式系统的面貌。现在大多数分布式系统都是 n 层系统,这类系统对扩展性和互操作性的要求越来越高。因此,非连接数据处理和 XML 成为最佳实践,并为业界广为接受。ADO.NET 试图将一些现有的在.NET 旗下最好的精华都统成为一体.对于数据访问的所有的编程模式就综合性的,并是非常强大的.也许该模式不能一一满足你的每个要求,但它朝模式设计方向跨出了一大步,不管如何,请记住 ADO.NET只是一个测试版,而且只有有限的文档支持.ADO 程序员从该测试版中将会受益非浅,因为他们已经熟悉了关于 ADO.NET 的方方面面,包括关于 abstraction 的最高层次- inspiring 模型. ADO.NET 代码与现有的 ADO 代码并不兼容,但是功能却近似. 为完全发挥 ADO.NET 的优势,与其只是简单的计算出最快的方式来放置代码,还不如实实在在的弄清楚 ADO.NET 它本身的要领.不管如何,.你所选择的 NET 编程模式- Windows Forms, Web Forms, or Web Services,ADO.NET 都会在数据存取方面帮你一把.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报