为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

ASP.ADO.NET

2011-09-15 36页 pdf 533KB 58阅读

用户头像

is_245402

暂无简介

举报
ASP.ADO.NET ADO.NET完全攻略 [前言:]ADO.NET是微软在.NET平台下提出的数据库访问模型,与 ADO相比 ADO.NET与 ADO有很 大的不同。它是一个全新的数据访问模型。当你开始使用 ADO.NET时,你会发现你所掌握的任何关 于 ADO的技能在搭建有效的程序以及解决难题方面对你都会有很大帮助,能够帮你在解决问题上朝 更灵活更稳妥的方向发展 ADO.NET 不是 ADO 为适应.NET 基础构造而进行改进的版本.当你慢慢了解了 ADO.NET 的语法, 代码设计以及移植后,你就会清楚了。 入门篇 ...
ASP.ADO.NET
ADO.NET完全攻略 [前言:]ADO.NET是微软在.NET平台下提出的数据库访问模型,与 ADO相比 ADO.NET与 ADO有很 大的不同。它是一个全新的数据访问模型。当你开始使用 ADO.NET时,你会发现你所掌握的任何关 于 ADO的技能在搭建有效的程序以及解决难题方面对你都会有很大帮助,能够帮你在解决问题上朝 更灵活更稳妥的方向发展 ADO.NET 不是 ADO 为适应.NET 基础构造而进行改进的版本.当你慢慢了解了 ADO.NET 的语法, 代码以及移植后,你就会清楚了。 入门篇 ADO.NET 是新的数据访问编程模型,需要开发人员的全面理解、投入和新思维。 ADO.NET入门 本文主要讨论了作为实现基本数据库操作方法之一的 ADO.NET,以及 ADO.NET 与 ADO 的基本比 较 提高篇 在这一部分我们将详细介绍 ADO.NET的主要对象及其属性,方法,让您更快的掌握 ADO.NET对 象模型 ADO.NET 数据库实例教程 ADO.NET数据库编程比较复杂,名目繁多的类、对象、属性、方法让每一个编程者都感觉恼火。 本文旨在介绍 ASP.NET Beta2数据库编程的主要内容,帮助编程者最快的了解 ADO.NET数据库编程 的精髓 实战篇 在这一篇中我将向大家介绍各种使用 ADO.NET操作数据库的实践,我想说明的是由于 ADO.NET 是一个通用的数据库访问模型,因此在选择文章的时候,我没有拘泥于某一种开发工具 * 在 Visual C#中访问不同数据库 * 在 Visual C#中用 ListView显示数据记录 * ASP.NET数据库编程 ADO.NET入门 简介:本文主要讨论了作为实现基本数据库操作方法之一的 ADO.NET,以及 ADO.NET与 ADO的基本比 较 ADO.NET 将成为构建数据感知 .NET 应用程序的基础. 不同于 ADO 的是,ADO.NET 更具有通用 性,不是那么专门针对数据库而进行的设计. ADO.NET 聚集了所有可以进行数据处理的类.这些类 呈现了具有典型数据库功能的 data container objects,比如:索引,排序,浏览.尽管 ADO.NET是作 为重要的.NET 数据库应用程序的解决,它更多的显示了涵盖全面的设计,而不仅是作为和 ADO 模型一样的以数据库为中心。. ADO .NET与 ADO有很大的不同.它是一个全新的访问编程模型.当你开始使用 ADO.NET时,你会 发现你所掌握的任何关于 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 提供程序顶端的.NET 接口,利用 COM Interop 桥来进行工作. 关于 ADO.NET的入门知识,你可以读读 Omri Gazitt's的文章,文章里主要介绍了 ADO+: 关于微软..NET 框架的数据库访问服务(Data Access Services),而我的文章里关于 ADO+的论 述主要指出了数据种类的进化.前者更纯技术化,并提供了更高水平的关于 ADO.NET 编程模型的概 述。后者主要是解释 ADO.NETR的目标,以及它与 XML,脚本及其它技术的联系. 2.读取数据 ADO.NET 应用程序要从数据源里读取数据,首先得创建一个连接对象.这个连接对象可以是 SQLConnection 或是 ADOConnection,这取决于所采用的目标提供程序. 需要记住的是,虽然在这 里不做推荐,但你也可以利用 ADO .NET 类来连接到 SQL Server 数据库. 这种方法唯一不足是,代 码需要通过一个不必要的额外代码层. 首先它会调入 ADO的托管提供程序, 然后 ADO的托管提供程 序再调用 SQL Server OLE DB 提供程序. 如同 OLE DB 提供程序做的一样,SQL Server 托管提供程 序会直接操作数据, 关于 ADO 和 ADO.NET在连接对象上最大的差别在于 ADO.NET连接不支持 CursorLocation属性. 与其说这是一个文档 BUG,还不如认为这是一个备具争议的设计问题.为强制执行它的以数据为中心 的基准,ADO.NET没有游标的显示实现. 在 ADO中,你已习惯于利用游标将记录从数据库或其它 OLE DB兼容的数据源中抽取, 你可以选 择客户端或是服务器端游标,每种游标都有几个预先设定的游标类型. 而在 ADO.NET 中更多的是从 数据源中抽取数据,并且为读取和分析数据提供新的编程接口 在 ADO中,通过规定连接和命令文本,你可以创建一个 Recordset 对象.对于游标的位置和类型 Recordset有一些规定.你可以按下面的方法来读取数据. 在内存中创建选定记录的静态副本,然后在断开与数据源的连接时对副本进行处理,ADO称之为 静态游标. 通过快速的, 仅向前的, 只读游标来滚动数据,,ADO称之为仅向前游标. 通过服务器端游标来访问数据,需要良好的连接,但您可以在不同层面上检测由其它连线用户 输入的信息,ADO称之为: 动态游标. 头两种都是在断开的 recordsets 上进行操作,并从客户端缓存中读取信息,另外,前两种方式 也常被用于面向 WEB的环境中以及全新的 n-tier 系统当中. 在 ADO 中,以上所有这些方式与不同类型的游标相对应 .在文中,你将会发现,ADO.NET 虽然与 ADO 不同,但它具备了 ADO 的所有功能.相对照来说,你的代码将从实际的数据源及其物理存储媒介 和格式中抽取数据. ADO.NET 能够使 DataSet 和 DataReader 将数据从数据源中抽取出来.前者是记录在内存中的 缓存,你可以从任意方向访问并随意作出修改. 后者是高度优化的对象,在只读纪录集中以仅向前 方式向前移动。注: DataSet 看起来象是静态游标,但实际上,在.NET中,与 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 database,或是 OLE DB 提供程序,, XML 文件,又或是数组,你都可以使用一样的方法和属性来进行处理. Figure 1. Solution Explorer menu 如果你坚持在.NET 世界中使用 ADO,那么请准备好面对一些其它的影响,例如你需要额外的代 码才能够从数据绑定控件中使用 recordset. 3.DataSet, DataTable, and Recordset 关于Recordset object.,ADO.NET并没有与其直接相对应的对象.最接近的是DataTable 对象. 虽然它们二者几乎具有相同的功能,但它们在各自的框架里发挥着不同的作用. 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 通过如行,列这样的通用集合,公开自身的内容.当你尝试从数据 表读取数据时,你也许正穿过了两个不同的层面: DataTableMapping 和 DataView. DataTableMapping 对象包含了数据源中的数据列,以及 DataTable object之间的映射关系. 当填充 DataSet 时,DataSetCommand 对象要使用这个类。它维护数据集中的抽象列和数据源 中的物理列之间的链接。 表的视图通过 DataView 对象实现。它表示 DataTable 的自定义视图,可以绑定到特定控件 (如 Windows 窗体和 Web 窗体中的数据网格)中。该对象相当于 SQL CREATE 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 的 Constraints 集合中来进行此操作。 ForeignKeyConstraint 对象表示当删除或更新数值和行时,对通过外键关系相关联的一组列的约 束。如前面提到的,一旦设置好了关系,在它按程序预设终止之前,您不能进行可能破坏该关系的 更改。 正如早先提到的一样,一旦设置了 relationship,除非它是程序性的终止,你不能够对它进行修 改,那样会使它突然中断. 另外, relations没有递延性.你可以在 Customers 和 Orders之间,Orders 和 Products之间 设置两个不同的关系.但是,当为了某个 customer而对 orders导航时,你不能够从一个 order跳到 相关的 products行.解决方法是,你必须另外打开 Orders/Products 关系,锁定你需要的 order,然 后获取相关的行. 程序员需要在 ASP Session 对中存储记录吗?通过 ADO .NET 和 DataSet 对象,你可以非常安 全的进行工作,而不会引起在"Storing an ADO Recordset in GIT Might Cause 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 或者 ADODataSetCommand 注: 在 Beta 2中, DataSetCommand对象被称为 DataAdapter 对象. 一旦你采用了 DataSetCommand对象,你可以使用它的 Update 方法. DataSetCommand提供了一 系列属性:如 InsertCommand, DeleteCommand, UpdateCommand, and SelectCommand.它们都是 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 transferring. 任何你输 入进到 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 或 Access 表。它 只是一个 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都会在数据存取方面帮你一把. ADO.NET 数据库实例教程 ADO.NET数据库编程比较复杂,名目繁多的类、对象、属性、方法让每一个编程者都感觉恼火。本 文旨在介绍 ASP.NET Beta2数据库编程的主要内容,帮助编程者最快的了解 ADO.NET数据库编程的 精髓。 一、 Managed Providers 如果你是初学者,可能你会问,什么是"Managed Providers"? Managed Providers提供简单的方法连接和访问数据库,有点类似于数据库连接,当然又比它 强的多。Managed Providers提供 OleDb和 SQL Server两种编程接口。因为 SQL Server是微软自 己的产品,因此,专门提供了一个针对 SQL Server的接口,使用这个接口访问 SQL Server的效率 应该比使用 OleDb强。 NameSpaces 本文所有的例子程序都需要使用以下 NameSpaces: <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.Oledb" %> Connection 为了连接数据库,必须使用 OleDbConnection: Dim objConn as New OleDBConnection ("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=e:\sff\site\db\users.mdb") 当然,你也可以将具体的连接方法作为变量使用,在连接数据库以后,必须打开数据库: objConn.Open() 这样,就可以使用数据库了,一般在最后,我们都要求关闭数据库连接: objConn.Close() objConn=Nothing Command 连接数据库以后,就可以发送命令对数据库进行操作了,OleDbCommand 允许发送命令对数据 库进行操作。根据发送的 SQL语句,我们可以对数据库进行几乎所有操作。 Dim objCmd as New OleDbCommand("SELECT * From users", objConn) 以上语句建立 Command,根据习惯不同,也可以使用以下方法: Dim objCmd as New OleDbCommand() objCmd.Connection = objConn objCmd.CommandText = "SELECT * FROM users" 还可以这样: Dim objCmd as New OleDbCommand(SQL String, connection string) 仔细观察上面的语句,我们发现在定义 OleDbCommand 时,可以同时使用数据库连接 OleDbConnection和数据库连接语句。以上代码并没有执行 SQL语句,现在我们来看到底怎样执行: ExecuteNonQuery 当执行没有返回数据的操作的时候,我们可以使用以上方法,比如插入数据、更新数据等操作, 具体这样执行: objCmd.ExecuteNoQuery ExecuteReader 在需要一个 Data Reader的时候,我们可以使用以上方法,具体这样执行: Dim objRd as OleDbDataReader objRd = objCmd.ExeuteReader ExecuteScalar 使用 ExecuteScalar方法来取得一个单个地返回数据,比如对数据的统计。 Data Reader OleDbReader是专门用来读取数据的对象,这个对象除了读数据以外,不能做其他任何数据库 操作。尽管比较简单,但是在用来浏览数据的时候效率是非常高的。 Dim objReader as OleDbDataReader objReader = objCmd.ExecuteReader While objReader.Read Response.Write(objReader.GetString(0) & "<br>") End While 以上语句读取 Command的返回结果的第一个字段,这个字段是字符型数据。我们可以使用其他 方法取得各种类型的数据: GetBoolean(x) GetByte(x) GetBytes(x) GetChar(x) GetChars(x) GetDataTypeName(x) -取得数据类型 GetDateTime(x) GetDecimal(x) GetDefaultStream(x) GetDouble(x) GetFieldType(x) GetFloat(x) GetGuid(x) GetInt16(x) GetInt32(x) GetInt64(x) GetName(x) - 取得字段名 GetOrdinal(name) -根据字段名取得字段序号 GetString(x) GetTimeSpan(x) GetValue(x) GetValues(values()) 以上方法都是 Command返回数据。 Data Adapter OleDbDataAdapter取得数据并且数据与 DataSet之间建一座桥梁,可以这样使用: Dim objAdapter as New OleDbDataAdapter("SELECT * FROM users", objConn) 实现方法有点类似于 OleDbCommand。OleDbAdapter 可以填充 DataSet,也可以修改数据然后 提交以实现对具体数据的修改: Dim ds as Dataset = New DataSet() objAdapter.Fill(ds, "users") 以上语句实现将 SQL语句取得的 Users表的数据填充到 DataSet。 Mappings Mappings可以实现对 DataSet的列取别名: objAdapter.TableMappings.Add("adbtable", "users") With objAdapter.TableMappings(0).ColumnMappings .Add("PID", "ID") .Add("LastName", "LName") .Add("StreetAddress", "Addy") End With objAdapter.Fill(ds) 当使用了以上代码以后,就可以用 ds.Tables("users")来代替 ds.Tables("adbtable")了。 Command Builder 在下一章我们可以看到 Command Builder的具体使用和强大功能。 练习: 如果你能理解以下代码,你就可以看下一章的内容了: <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.Oledb" %> <script language="VB" runat="server"> Sub Page_Load(sender as object, e as eventargs) Dim objConn as New OleDBConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=e:\sff\site\db\users.mdb") objConn.Open() Dim ds as Dataset = New DataSet() Dim objAdapter as New OleDbDataAdapter("SELECT * FROM users", objConn) Dim objCmdBld As New OleDbCommandBuilder(objAdapter) objAdapter.Fill(ds, "users") End Sub </script> 二、 Data Set 本章将介绍 DataSet对象,DataSet对象包含内容很多,我们基本上都将涉及,包括 DataTables、 DataRows等。 什么是 DataSet 回头看看 ASP,我们知道当查询数据的时候,返回的数据是放在 RecordSet 中的,RecordSet 只能保存返回的一个表的数据,而且它很不灵活。 DataSet在 RecordSet上增加了很多功能,并且,它可以保存多个返回的数据表结果。 DataSet被分解为很多部分比如 DataTables和 DataRows,可以使用它们创建一个 DataSet而 不一定要连接到一个具体的数据库。当然,DataSet本身就是离线数据,所有的数据都可以离线使 用而不必一直连接到数据库,只有需要对数据库进行编辑的时候才需要连接到数据库。 实践 Dim ds1 As New DataSet() Dim dtable As new DataTable("people") With dtable.Columns .Add("FName", System.Type.GetType("System.String")) .Add("LName", System.Type.GetType("System.String")) .Add("UID", System.Type.GetType("System.Int32")) End With dtable.Columns("UID").AutoIncrement = True ds1.Tables.Add(dtable) dim pkey() as DataColumn = {ds1.Tables("people").Columns("UID")} ds1.Tables("people").PrimaryKey = pkey 以上语句稍微有点复杂,我们来看看: 前半部分我们建立了一个 DataSet和一个叫 People的 DataTable,然后,我们为这个 DataTable 加入了三个列并将"UID"列设为自动递增。最后,将这个 DataTable加入到了 DataSet。 第二部分我们现在不需要理解,只要知道定义了主键就可以了 DataTables DataTable就是一个数据表,我们可以对这个表进行如:增加数据、修改数据等操作。我们也 可以通过 DataSet建立一个 DataTable: Dim dtable As DataTable = ds1.Tables("people") 这样,将 DataSet的表 People的结构和数据拷贝到了 DataTable中,尽管它是无连接的,但 是仍然可以通过修改这个 DataSet来更新 DataSet表,因此,如果我们在 dtable中增加一列并且 接受改变就以实现对 DataSet的修改: Dim row as DataRow = dtable.NewRow() row(0) = "Philip" row(1) = "Quinn" dtable.Rows.Add(row) dtable.AcceptChanges 这样我们就建立了一个新的 DataRow,这和用 dtable.NewRow()建立一个新的数据列一样,我 们还可以给这个列取名了 Fname。 因为以上的 DataTable 来自 DataSet,如果我们使用 dtable.AcceptChanges 方法更新 DataTable,DataSet也会被更新: <%@ Import Namespace="System.Data" %> <script language="VB" runat="server"> Sub Page_Load(sender as object, e as eventargs) Dim ds1 As New DataSet() Dim dtable As new DataTable("people") With dtable.Columns .Add("FName", System.Type.GetType("System.String")) .Add("LName", System.Type.GetType("System.String")) .Add("UID", System.Type.GetType("System.Int32")) End With dtable.Columns("UID").AutoIncrement = True ds1.Tables.Add(dtable) Dim dtable2 As DataTable = ds1.Tables("people") Dim row as DataRow = dtable2.NewRow() row(0) = "Philip" row(1) = "Quinn" dtable2.Rows.Add(row) dtable2.AcceptChanges Response.Write(ds1.Tables("people").Rows(0)("FName").ToString) End Sub </script> 以上代码将显示"Philip",现在我们来看看具体过程: 1、 建立一个 DataSet和一个叫"People"的 DataTable; 2、 增加三个数据列并且设置它们的数据属性; 3、 将它们加入到 DataSet; 4、 建立另外一个 DataTable,这个 DataTable是刚才建立的那个的拷贝; 5、 用 DataTable建立新的 DataRow并加入数据; 6、 接受数据改变同时更新了 DataSet; 7、 显示第一个数据列; DataRows DataRow是 DataTable的数据列,刚才我们已经看到,我们可以使用 DataTable的以下方法建 立一个新的 DataRow: ds1.Tables("people").Rows(0)("FName") = "Phil" 以上语句中,ds1.Tables("people")选择表"people",.Rows(0)选择表的第一行,("FName") 选择表的字段为"Fname"。 DataRows是数据列的集合,通过以下语句取得: Dim drow as DataRowCollection = ds1.Tables("people").Rows 对于 DataRows,我们基本上不能做太多。如果针对一个具体的数据列,我们可以这样: Dim drow2 as DataRow = drow.Item(0) 需要修改这个列的数据,可以这样: drow2(0) = "Philip" drow2.AcceptChanges 可能说了那么多,我们都觉得比较复杂,我们来看看这个图示: 通过这个图示我们很容易就理清了 DataSet、DataTable、DataRowCollection、DataRows、 DataColumn和 DataColumnCollection之间的相互关系。 三、 DataSet的使用 在第一章我们介绍了数据连接、执行查询等内容,第二章我们介绍了 DataSet的方方面面,这 一章我们将具体使用 DataSet。 DataSet <-> Data Source DataSet 和 Data Source 通过 DataAdapter 进行联系,当 DataSet 取得数据库数据以后,就和 数据库断开连接,针对数据作的所有数据修改在没有提交以前都在 DataSet里面保存。 数据修改 我们将通过一个小的举例来说明数据怎样被修改和提交。 这是数据结构(Access设计) Field Name Type FName LName ID FName Text Philip Quinn 1 LName Text Joesph Payne 2 ID AutoNumber Douglas Adams 3 Michael Okuda 4 举例一: 我们将一段一段的看程序代码: <%@ Page Language="VB" %> <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.Oledb" %> <script language="VB" runat="server"> Sub Page_Load(sender as object, e as eventargs) 以上代码导入 NameSpace同时说明编程语言为 VB; Dim objConn as New OleDBConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=e:\sff\site\db\test.mdb") objConn.Open() Dim ds as Dataset = New DataSet() Dim objAdapter as New OleDbDataAdapter("SELECT * FROM users", objConn) Dim objCmdBld as New OleDbCommandBuilder(objAdapter) objAdapter.Fill(ds, "users") 以上代码建立了 Connection、DataAdapter和 CommandBuilder,并且填充了 DataSet。我们必 须注意以下几点: 一、 DataAdapter是数据和 DataSet之间的桥梁; 二、 CommandBuilder建 SQL语句来执行; Dim drow as DataRow 以上语句声明一个 DataRow; drow = ds.Tables("users").NewRow() drow(0) = "Gene" drow(1) = "Rodenberry" ds.Tables("users").Rows.Add(drow) drow = ds.Tables("users").NewRow() drow(0) = "Maxwell" drow(1) = "Stewart" ds.Tables("users").Rows.Add(drow) 以上代码为 DataSet增加一个新的列; objAdapter.Update(ds, "users") 以上代码将更新提交到数据库; End Sub </script> 现在看看数据库,会发现已经多了两列。 另外一个举例 我们可以看一个完整的举例: <%@ Page Language="VB" Debug="true" %> <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.Oledb" %> <script language="VB" runat="server"> Sub Page_Load(sender as object, e as eventargs) Dim objConn as New OleDBConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=e:\sff\site\db\test.mdb") objConn.Open() Dim ds as Dataset = New DataSet() Dim objAdapter as New OleDbDataAdapter("SELECT * FROM users", objConn) Dim objCmdBld as New OleDbCommandBuilder(objAdapter) objAdapter.Fill(ds,
/
本文档为【ASP.ADO.NET】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
热门搜索

历史搜索

    清空历史搜索