ADO.NET入门

ADO.NET入门  1
简介:本文主要讨论了作为实现基本数据库操作方法之一的ADO.NET,以及ADO.NET与
ADO的基本比较
    ADO.NET将成为构建数据感知 .NET应用程序的基础. 不同于ADO 的是,ADO.NET更
具有通用性,不是那么专门针对数据库而进行的设计. ADO.NET聚集了所有可以进行数据
处理的类.这些类呈现了具有典型数据库功能的data container objects,比如:索引,排
序,浏览.尽管ADO.NET是作为重要的.NET数据库应用程序的解决方案,它更多的显示了涵
盖全面的设计,而不仅是作为和ADO模型一样的以数据库为中心。.
    ADO .NET与ADO有很大的不同.它是一个全新的访问编程模型.当你开始使用ADO.N
ET时,你会发现你所掌握的任何关于ADO的技能在搭建有效的程序以及解决难题方面对你
都会有很大帮助,能够帮你在解决问题上朝更灵活更稳妥的方向发展.
    ADO.NET不是ADO为适应.NET基础构造而进行改进的版本.当你慢慢了解了ADO.NET
的语法,代码设计以及移植后,你就会清楚了.
    1.NET中的数据访问
    访问ADO.NET中的数据源是由托管提供程序所控制. 虽然托管提供程序与OLE DB有
两处重大的不同,但是二者是极为类似的.首先, 托管提供程序在.NET环境下运行,通过
DataReader 和DataTable .NET类来检索和展示数据.第二,它们的体系结构都比较简单,
是因为为了适应.NET而进行了优化.
    此时,ADO.NET分成两种不同类型的托管提供程序:一种用于SQL Server? 7.0 或
更高版本,另一种适用于所有你可能已经安装的OLE DB 提供程序.虽然运用在两种托管提
供程序中的类是不同的,但它们却都遵循相类似的命名方式.除开前缀之外,其它名称都是
相同的.前一种情况前缀为SQL, 后一种则是ADO.
    你需要利用SQL类来访问SQL Server 表,因为SQL类会跳过由OLE DB 提供程序呈现
的中间层, 而直接进入数据库服务器内部API. ADO类是位于OLE DB 提供程序顶端的.NE
T接口,利用COM Interop 桥来进行工作.
    关于ADO.NET的入门知识,你可以读读Omri Gazitt's的文章,文章里主要介绍了AD
O+:
    关于微软..NET 框架的数据库访问服务(Data Access Services),而我的文章里关
于ADO+的论述主要指出了数据种类的进化.前者更纯技术化,并提供了更高水平的关于AD
O.NET编程模型的概述。后者主要是解释ADO.NETR的目标,以及它与XML,脚本及其它技术
的联系.

 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=476749

 ADO.NET入门 2
  2.读取数据
    ADO.NET应用程序要从数据源里读取数据,首先得创建一个连接对象.这个连接对象
可以是SQLConnection 或是 ADOConnection,这取决于所采用的目标提供程序. 需要记住
的是,虽然在这里不做推荐,但你也可以利用ADO .NET 类来连接到SQL Server数据库. 这
种方法唯一不足是,代码需要通过一个不必要的额外代码层. 首先它会调入ADO的托管提
供程序, 然后ADO的托管提供程序再调用SQL Server OLE DB 提供程序. 如同OLE DB 提
供程序做的一样,SQL Server 托管提供程序会直接操作数据,
    关于ADO 和ADO.NET在连接对象上最大的差别在于ADO.NET连接不支持CursorLoca
tion属性.与其说这是一个文档BUG,还不如认为这是一个备具争议的设计问题.为强制执
行它的以数据为中心的基准,ADO.NET没有游标的显示实现.
    在ADO中,你已习惯于利用游标将记录从数据库或其它OLE DB兼容的数据源中抽取
, 你可以选择客户端或是服务器端游标,每种游标都有几个预先设定的游标类型. 而在A
DO.NET中更多的是从数据源中抽取数据,并且为读取和分析数据提供新的编程接口
    在ADO中,通过规定连接和命令文本,你可以创建一个Recordset 对象.对于游标的
位置和类型Recordset有一些规定.你可以按下面的方法来读取数据.
    在内存中创建选定记录的静态副本,然后在断开与数据源的连接时对副本进行处理
,ADO称之为静态游标.
    通过快速的, 仅向前的, 只读游标来滚动数据,,ADO称之为仅向前游标.
    通过服务器端游标来访问数据,需要良好的连接,但您可以在不同层面上检测由其
它连线用户输入的信息,ADO称之为: 动态游标.
    头两种都是在断开的recordsets上进行操作,并从客户端缓存中读取信息,另外,前
两种方式也常被用于面向WEB的环境中以及全新的 n-tier 系统当中.
    在ADO中,以上所有这些方式与不同类型的游标相对应 .在文中,你将会发现,ADO.
NET虽然与ADO不同,但它具备了ADO的所有功能.相对照来说,你的代码将从实际的数据源
及其物理存储媒介和格式中抽取数据.
    ADO.NET能够使DataSet 和 DataReader 将数据从数据源中抽取出来.前者是记录
在内存中的缓存,你可以从任意方向访问并随意作出修改. 后者是高度优化的对象,在只
读纪录集中以仅向前方式向前移动。注: DataSet 看起来象是静态游标,但实际上,在.N
ET中,与ADO只读游标相对应的是DataReader 对象.
    在ADO.NET中,虽然对于服务器端的游标不提供任何支持,但这不意味着你就不能使
用游标.实际上,你所需要做的步骤是在.NET中输入ADO库.你只需在references node上单
击右键,就可以在你自己的程序里运行本地ADO 对象.
    但是我个人认为,在你想转向.NET时,请慎重考虑. 首先,请务必完全输入ADO, 这
不会花费太多时间和精力,这是向.NET迈出的第一步,.但是,这仅仅是万里长征的第一步
而且也是通向.NET必须的一步. .NET的真正附加值是基于一个均匀的,持续稳定的接口以
及本地classes的广为应用之上的.关于COM libraries是可以被支持的,合理的,但不被鼓
励的,因为它仅仅是个短期解决方案,或者是一个过渡步骤.
    当你要开始使用ADO.NET时,请考虑这样一个事实:ADO.NET统一了数据容器类编程
接口,.因此,不管是何种类型的程序: Windows Form, Web Form, 或者 Web Service也好
,你都得在同一组类中集中处理有关数据. 不管处于后端的数据源是SQL Server databa
se,或是OLE DB 提供程序,, XML文件,又或是数组,你都可以使用一样的方法和属性来进
行处理.
  Figure 1. Solution Explorer menu
    如果你坚持在.NET世界中使用ADO,那么请准备好面对一些其它的影响,例如你需要
额外的代码才能够从数据绑定控件中使用recordset.

 ADO.NET入门 3
  3.DataSet, DataTable, and Recordset
    关于Recordset object.,ADO.NET并没有与其直接相对应的对象.最接近的是Data
Table 对象.虽然它们二者几乎具有相同的功能,但它们在各自的框架里发挥着不同的作
用.
    Recordset是一个相当大的对象,具备ADO的大多数功能,但在某些方面仍有欠缺.
Recordset在一些方面性能优良,如:它具可创造性,它可以离线操作,功能众多,但在一些
方面仍需改进,如:基于其固有的COM特性, Recordset很难在网络上连载; Recordset是一
个二进制的对象,因此不同平台之间的模块很难共享它;还有就是蛇不能够穿过防火墙.另
外,它表现的是记录的单个表.如果该table作为一个或几个JOIN的结果,那么它很难更新
原始代码源.当你试图将脱线的recordset与原始代码源统一起来时,数据源必须能够识别
SQL.不管如何,你的recordset可以由非SQL 提供程序创建.
    在ADO.NET中,ADO Recordset的所有功能被分拆成几块更简单的对象:其中一个便
是DataReader. DataReader模拟了快速,只读,仅向前的只读游标的操作.
    DataTable,表现了数据源,是个简单的对象. 你可以手动构造一个DataTable,或者
也可使用DataSet命令自动生成. DataSet对于它所包含的数据知之不多.通过它,你可以
在内存中处理数据,或者是其它比如排序,编辑,筛选,创建浏览等工作.
    DataSet对象是一个数据容器类,是实现ADO.NET数据抽取的关键对象. DataSet集
合了一个或几个DataTable 对象. DataTable 通过如行,列这样的通用集合,公开自身的
内容.当你尝试从数据表读取数据时,你也许正穿过了两个不同的层面: DataTableMappi
ng 和 DataView.
    DataTableMapping 对象包含了数据源中的数据列,以及DataTable object之间的
映射关系.
    当填充 DataSet 时,DataSetCommand 对象要使用这个类。它维护数据集中的抽
象列和数据源中的物理列之间的链接。
    表的视图通过 DataView 对象实现。它表示 DataTable 的自定义视图,可以绑定
到特定控件(如 Windows 窗体和 Web 窗体中的数据网格)中。该对象相当于 SQL CRE
ATE VIEW 语句在内存中的实现。
    DataSet中所有的表,通过一个公共的域,相互之间能产生关联.它们之间的联系是
由DataRelation 对象来进行管理.这样说起来挺象ADO的数据形成,但还是有一个最大的
不同.
    在DataRelation里,你不需要使用数据形成语言,而且还可以获得非常灵活的组织
架构. 通过ADO .NET 导航模型,你可以很容易的从某一张表中的主行移动到它的所有子
行里.
    DataRelation object是关于JOIN 语句在内存中的实现,可用于建立数据类型相同
的的parent/child关系,. 一旦关系确立,任何破坏这种关系的修改都被禁止. Views和
relations是完成master/detail 架构的两个方法.请记住view仅是加载于记录之上的掩
码, 但是relation
    是位于几个列之间的动态链接,在relation下,你无法更改顺序或是设置条件.
    如果你的代码需要1对1的外键关系,而且更改数据,最好不用JOIN命令.如果你需要
额外的筛选功能,你可以寻求ADO .NET自定义视图的支持.

4.转换现有代码
    大量的ASP页面使用ADO对象来抽取数据.让我们一起来回顾下几例典型的案例,对
你在以后处理移植或者改写代码时也许会有帮助。
    如果你有从单个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);
  oCN.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或是一个或多个DataRow 对象.
    当你需要处理表与记录二者之间的复杂关系时,DataReader就不是合适的工具了
。数据模型链接越多,SQL命令则会越复杂。导航模块保有连续性,最后放入缓存的数据
往往多于你所需要的,. DataSet 和 DataRelation objects是这种表关系模型的基础.
    为管理parent/child 关系,ADO同样也对data-shaping engine进行封装. 总的说
来, data shaping 和 ADO .NET 关系是一回事.就设计方面来说,二者几乎没有共同点.
Shaped recordsetsct嵌入列表对象中包括了所有数据表信息。ADO.NET关系是动态链接
,你可以在两个数据表间随时建立. ADO依靠于Shaping OLE DB service 提供程序,并使
用专门的SQL类语言特征以在执行单个ADO命令的过程中生成一个分层的recordset.
    在 ADO.NET 中,关系中涉及的每个对象总是被看成单独的个体。关系本身作为对
象被公开,并且具有一定的行为规则。例如,DataRelation 对象可以从父行到子行一层
层进行更改。您可以通过将 ForeignKeyConstraint 对象添加到 DataTable 的 Constr
aints 集合中来进行此操作。ForeignKeyConstraint 对象表示当删除或更新数值和行时
,对通过外键关系相关联的一组列的约束。如前面提到的,一旦设置好了关系,在它按
程序预设终止之前,您不能进行可能破坏该关系的更改。
    正如早先提到的一样,一旦设置了relationship,除非它是程序性的终止,你不能够
对它进行修改,那样会使它突然中断.
    另外, relations没有递延性.你可以在Customers 和Orders之间,Orders 和 Pro
ducts之间设置两个不同的关系.但是,当为了某个customer而对orders导航时,你不能够
从一个order跳到相关的products行.解决方法是,你必须另外打开Orders/Products 关系
,锁定你需要的order,然后获取相关的行.
    程序员需要在ASP Session 对中存储记录吗?通过ADO .NET 和 DataSet 对象,你
可以非常安全的进行工作,而不会引起在"Storing an ADO Recordset in GIT Might Ca
use An Access Violation"中所论及的麻烦.


5.更新数据
    Web程序通常利用无程式语句或者通过参数代存储过程来更新数据.但是,当遇见脱
线的数据时,你也许希望利用内置服务来更新所有需要修订的记录.为完成这一工作.ADO
提供了成批的更新机制.
    UpdateBatch 方法用于把保存在副本缓冲中的 Recordset 更改发送到服务器,以
更新数据源。它采用开放式锁定,允许所有挂起的本地更改。它还在单个操作中把所有
更改传送到数据源。仅当更改提交后数据源锁定要更改的记录时,才会出现开放式锁定
。开放式锁定使两个用户可以同时访问同一个记录,但一个用户输入的更改很快会被另
一用户所覆盖。当然,这种方式要求数据源能够检测和防止数据冲突。还要求整个数据
源比较稳定,不会发生频繁的更改。否则,不难想象协调费用将很快超过替代严格锁定
所带来的节约。事实上,使用 UpdateBatch 方法,在任何更改失败时都会返回一个错误
。然后,您可以通过 Errors 集合和 Error 对象来访问该错误。
    要理解 ADO.NET 模型为什么是更新数据的更强大的工具,理解 ADO 中开放式锁
定的工作原理是非常关键的。在 ADO 代码中,您无法控制调用 UpdateBatch 之后所发
生的一切。也就是说,更新是在服务器上通过滚动已更改的行,然后比较原始值和数据源
中对应记录中的当前值来进行的。当所有的值都一致了,才对表执行适当的 SQL 语句(
INSERT、UPDATE 或 DELETE)。
    以上陈述说明了你还不能够控制SQL 语句。位于服务器端的更新 代码既不会比你
自己写的好,也不会在你采用的非SQL 提供程序的情况下运作。在本章节的开始部份,
我已经讲了Web应用程序是典型的通过参数化存储进程来更新数据的过程。不管如何,如
果你用批更新,情况就会有所不同.
    在ADO.NET中, 模型已被扩展开来.现在,它采用更为通用的架构,通过它你可以规
定你自己关于基本运算的命令语句,如插入,删除,更新以及选择. 更明显的,你可以观察
到从数据源里提取数据的企图,并且不管数据源的本性,可以提供相同的支持.ADO.NET中
的批更新,要求你创建一个DataSetCommand 对象: SQLDataSetCommand 或者ADODataSet
Command
    注: 在Beta 2中, DataSetCommand对象被称为DataAdapter 对象.
    一旦你采用了DataSetCommand对象,你可以使用它的Update 方法. DataSetComma
nd提供了一系列属性:如InsertCommand, DeleteCommand, UpdateCommand, and Select
Command.它们都是Command对象,但你不能够对它们进行设置,除非缺省设置没有按你的要
求完成.这与ADO中一样.在Update过程中,如果没有设置xxxCommand属性,但是主关键字已
经存在内,则会自动生成Command对象.
    以下代码展示了如何为EmployeesList table设置主关键字,
  DataColumn[] keys = new DataColumn[1];
  keys[0] = m_oDS.Tables["EmployeesList"].Columns["EmployeeID"];
  m_oDS.Tables["EmployeesList"].PrimaryKey = keys;
    主关键字基本上是是DataColumn对象的一个数组.
    如果你想利用存储过程来更新表单,或者你利用专用非SQL 数据提供程序进行操作
,那么你将会常常用到这 些命令属性.

6.XML的延展支持功能
    在ADO中,XML仅仅只是作为输入和输出格式.但是,在ADO.NET中,XML作为数据记录
格式为你提供了一系列的方法,如: manipulating, reorganizing, sharing, and tran
sferring. 任何你输入进到DataSet中的数据,不管是不是原创,都能够通过双面编程模型
进行处理.
    如同XML文档一样,DataSet 读取/书写数据和模式。数据和模式在HTTP中是可转
移的,也可以在任一支持XML的平台上运行。相同的数据在不同的时间段通过不同的模式
可以被执行。你利用ReadXmlSchema来书写模式。 XML模式包含了data set中tables 的
名称,如同data set 中的relations 和 constraints一样。在调用ReadXmlData之前你
应该完成这个步骤
    以下代码示例是一个显示可更新数据表的最简单的 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 schema
  StreamReader sr;
  sr = new StreamReader(Server.MapPath("data.xml"));
  data.ReadXml(sr);
  sr.Close();
  // Add a new record passed through the URL
  if (Request.QueryString.Count >0)
  {
  DataTable dt = data.Tables[0];
  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("data.xml"));
  data.WriteXml(sw);
  sw.Close();
  }
  // Refreshes the UI (made of a grid)
  grid.DataSource = data.Tables[0].DefaultView;
  grid.DataBind();
  }
  </script>
    如图 2 所示,您可以将新的行添加到表中。然而,它不涉及 SQL Server 或 Ac
cess 表。它只是一个 XML 文件,在处理它的代码中,没有使用 XML 节点或 XMLDOM 方
法。您可以用相同的直观数据表接口来读取和更新 XML 记录。您的工作方式与在 ADO
中大致相同,但此处的模型更深入、更庞大,有更多的潜力供您去发掘。
       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都会在数据存取
方面帮你一把.

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值