通行证: 用户 密码 域名空间  下载中心 社区论坛 信息公告 my小屋
联系我们
设为首页
加入收藏

 

qq,asp,php,jsp,xml,sql,.net,编程 程序 网页图象 建站经验 私服
首页 | 新闻资讯 | 编程开发 | 网页设计 | 图形图象 | 网络媒体 | 网站模板 | 数 据 库 | 投稿
论坛 | 操作系统 | 系统优化 | 网络安全 | 黑客技术 | 硬件学堂 | 硬件报价 | 服 务 器 | 地图
专题 | 应用软件 | 聊天通讯 | q q 专栏 | 建站经验 | 在线工具 | 站长club | 注 册 表 | 旧版
社会 | 游戏娱乐 | 设计欣赏 | 疑难解答 | 社区论坛 | 网络赚钱 | 网站地图 | 广告服务 | 服务
当前位置:首页>>编程开发>>sql专区>>正文 新版上线![旧版]
注:打开慢时请稍等
ado.net入门

http://www.iyit.net  日期:2006-5-3 19:12:13  来源:  点击:
参加讨论】   简介:本文主要讨论了作为实现基本数据库操作方法之一的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 中大致相同,但此处的模型更深入、更庞大,有更多的潜力供您去发掘。

  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都会在数据存取方面帮你一把.

编辑:黑鹰 [发送给好友] [打印本页] [关闭窗口] [返回顶部]
上一篇:sql进阶
下一篇:sql语言入门教程:第一课 简介
转载请注明来源:www.iyit.net
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。

 相关文章
最新更新 热点排行 推荐新闻
sql server 7.0与以前的版本相比,安全
设置proxy server和sql server实现互联
microsoft sql server 7.0安全问题   
mysql安全性指南(3)(转)           
mysql安全性指南 (2)(转)          
javascript实例教程(3-2)
javascript实例教程(3-1)
javascript实例教程(2) 创建弹出式窗
javascript实例教程(1) 目录
荧光文字
鼠标周围的文字宣传
随鼠标的闪烁小星星
鼠标右键显隐效果
状态栏特效
自动关闭弹出式窗口
sql server 7.0与以前的版本相比,安全
sql简明教程(6)
sql简明教程(5)
sql简明教程(4)
sql简明教程(3)
qq珊瑚虫外挂4.0版本发布!
多个广告位招商!
摄影后期系列一:1分钟为数码相片去红眼
qq挂机说明
asp进度条
photoshop通道抠图:给秀发飞扬的mm照
教您显示器亮度对比度的调节
新版上线,今日正式开通!!!
更多精彩图文广告等着您!
asp中使用sql语句教程
sql简明教程(1)
第二十章 开发delphi对象式数据管理功
sql简明教程(1)
vbscript和javascript互相调用 
jsp教程(四)-jsp actions的使用
操作系统被入侵后的修复过程
五一别忘电脑防毒 养成良好上网习惯
google对ie浏览器将捆绑搜索功能表担忧
新版上线,今日正式开通!!!
用photoshop创意图形“岁月”
摄影后期系列一:1分钟为数码相片去红眼

 友情链接
设置首 页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
copyrights © 2004-2006 iyit.net all rights reserved.
网站合作、广告联系qq:147007642、466949678
易特网络技术 点击这里给我发消息