没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
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中一样.在
剩余35页未读,继续阅读
qinghe1987
- 粉丝: 5
- 资源: 32
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 四数之和(java代码).docx
- 701837906919458TapScanner v3.0.10 (Pro).apk
- 青岛大学人工智能实验二 利用α-β搜索的博弈树算法编写一字棋游戏
- ### 1、项目介绍 本项目Scrapy进行数据爬取,并使用Django框架+PyEcharts实现可视化大屏 效果如下:
- # 微信小程序-健康菜谱 基于微信小程序的一个查找检索菜谱的应用 ### 效果 !动态图(./res/gif/demo
- zabbix-get命令包资源
- 289ssm-mysql-jsp 计算机课程实验管理系统.zip(可运行源码+数据库文件+文档)
- 毕业设计,基于PyQt5实现的可视化界面的Python车牌自动识别系统源码
- 20-天天果园项目.rar
- 26-朴素贝叶斯分类.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0