分享
 
 
 

ADO.NET深入研究(1)[特别推荐]

王朝c#·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

导 读:.NET 在数据存取方面做了很大的调整。在.NET 框架下,数据存取是由ADO.NET来完成的,这是一个ADO的改进和完善版本。它最显著的变化是其完全基于XML。而对于从事ADO开发的人员来说,Recordset对象的消失也令他们感到惊奇。

翻译整理:.net技术网(www.51dotnet.com)slash

原文出处:http://www.dnjonline.com/articles/essentials/iss22_essentials.html

.NET 在数据存取方面做了很大的调整。在.NET 框架下,数据存取是由ADO.NET来完成的,这是一个ADO的改进和完善版本。它最显著的变化是其完全基于XML。而对于从事ADO开发的人员来说,Recordset对象的消失也令他们感到惊奇。

微软对Recordset 对象的看法是:它相对于最初的为了产生一个SQL查询的结果的机制,显得有些过于臃肿了。因此,在ADO.NET中,Recordset对象的功能将被拆分到三个部分中去。首先是DataReader对象, 它所要完成的功能是将数据简单的表现出来;在ADO中,类似功能是由向前的、服务器端的光标(forward-only, server-side cursor)来实现的。然后是DataSet 和 DataSetCommand 对象,它们能够在客户端创建一个或一个以上的数据集合的缓存,并对它们进行操作。在ADO中,客户端光标的使用相对比较单一化,而在这方面ADO.NET则分别赋予这两个对象不同的功能,从而使它们具有更加专一而强大的功能。最后,是其他一些在ADO中能够实现的功能,比如说,利用Connection对象在保守锁定的情况下进行数据的更新。这是在ADO.NET中无法实现的功能,这意味着在某些时候,ADO将被继续使用。

在进入DataSet的讨论之前,我们先来简单的来看一看ADO.NET。

使用DataReader

ADO.NET提供了三个类:DBConnection, DBCommand 和 DBDataReader,它们与传统的ADO对象十分的相似。但是在.NET应用程序中它们不能被直接使用。能够使用的是从它们继承而来的类,比如ADOConnection, ADOCommand 和 ADODataReader来读取数据,这里的前提是存在一个OLEDB的Provider。如果要操作的对象是SQL Server,那么将使用另一些功能相同的类SQLConnection, SQLCommand 和 SQLDataReader 以便直接通过SQL Server 的 TDS 连接通道来获得更好的工作性能。下面是一个例子(因为在这里C#和VB.NET的代码区别不是很大,所以将只使用VB.NET的实例):

Imports System.Data

Imports System.Data.ADO

..

Dim cn As New ADOConnection()

cn.ConnectionString = strConnect

Try

cn.Open()

Dim cd As New ADOCommand(搒elect * from authors? cn)

Dim dr As ADODataReader

cd.Execute(dr)

While dr.Read()

listbox1.Items.Add(dr(揳u_lname?)

End While

Catch err As Exception

MsgBox(err.ToString)

Finally

If cn.State = DBObjectState.Open Then cn.Close()

End Try

在上面你会发现在While Loop语句中没有出现MoveNext方法,因为DataReader的Read方法将自动前移光标,并会在没有数据的时候返回一个False值。这显然减轻了开发者的工作量。

在两种情况下,DataReader被推荐使用:一、客户界面利用手写代码,或是没有用到数据绑定并且数据的更新是利用手写的SQL语句或是存储过程,这种情况下,DataReader将提供有效的访问相关数据的方法;二、一个需要查看数据库状态的的过程,但不需要实现诸如自动更新的功能。一些比较好的应用实例有向下拉菜单填充数据,以及产品编号的验证。

理解DataSets

对于一些开发者来说,可能会对DataSets的使用颇有微词,但事实上,掌握它并不难。如果你对连接断开的RecordSet 模式,以及分层的RecordSet 的使用不陌生,并且乐于使用一些XML的话,那么利用DataSets 就没有什么困难了。

可是有什么必要去花费时间去重新学习一种对象模型呢?

理由之一是,ADO.NET 力推的断开连接模式(disconnected model)是非常有意义的。断开连接的数据伸缩性更高,因为这种模式对数据服务器的压力比较小。通过平行服务器对中间层进行扩展比对数据层进行扩展要容易的多,因此对于可扩展的应用程序来说,对数据层资源的使用要谨慎。断开连接模式将在这里得到应用。

理由二,在数据管理方面,断开连接模式有非常广阔的前景。

如果说有一种技术的 发展比ADO还要迅速,这就是XML。XML解决了两个ADO所对的局限。

1、XML更加适用与跨平台的的数据传输,因为它能够穿越防火墙。

2、XML比ADO包括它的扩展ADO2.5描述的类型多。一个简单的例子,同样面对扁平的数据,普通的XML将比ADO显示出更高的效率。

DataSets是XML与ADO结合的产物,它的一个重要的特点是与数据库或SQL无关。它只是简单的对数据表进行操作,交换数据或是将数据绑定到用户界面上。

向DataSets中加入数据表的方法有两种:

1、利用DataSetCommand对象,它可以以XML 的形式返回一个数据库查询的结果。在处理数据库更新的时候,这种方法与ADO的客户端光标基本相同,但提供更强的控制。

2、直接对XML数据进行操作。DataSet 对象有对XML数据和Schemas进行读写的的方法,并且可以和XMLDataDocument对象(该对象是多用途XMLDocument类的继承)紧密的结合起来工作,它具有一些对扁平数据操作的特殊函数因此可以作为从DataSet 到通用XML DOM的桥梁。

下面是一段使用DataSet的代码:

Dim dc As New ADODataSetCommand( _

"select au_id, au_fname, au_lname from authors" & _

" where au_lname = ‘Ringer’", strConnect)

Dim ds As New DataSet()

dc.FillDataSet(ds, "Authors")

MsgBox(ds.XmlSchema, , "XML Schema")

MsgBox(ds.XmlData, , "XML Data")

以上的代码将一个‘AUTHORS’数据表填充到DataSet 对象实例 ds 中,并显示了XML数据和Schemas,请看两个显示结果:表1 和 表2

向DataSet中添加数据表的操作是非常容易的,请看下面的代码:

dc = New ADODataSetCommand( _

"select * from titleauthor" & _

" where title_id like 'PS%'", strConnect)

dc.FillDataSet(ds, "Titles")

MsgBox(ds.XmlData, , "XML Data")

表1显示XML Schema

表2显示DataSet 对象生成的数据

未 完 待 续

导 读:.NET 在数据存取方面做了很大的调整。在.NET 框架下,数据存取是由ADO.NET来完成的,这是一个ADO的改进和完善版本。它最显著的变化是其完全基于XML。而对于从事ADO开发的人员来说,Recordset对象的消失也令他们感到惊奇。

翻译整理:.net技术网(www.51dotnet.com)slash

原文出处:http://www.dnjonline.com/articles/essentials/iss22_essentials.html

.NET 在数据存取方面做了很大的调整。在.NET 框架下,数据存取是由ADO.NET来完成的,这是一个ADO的改进和完善版本。它最显著的变化是其完全基于XML。而对于从事ADO开发的人员来说,Recordset对象的消失也令他们感到惊奇。

微软对Recordset 对象的看法是:它相对于最初的为了产生一个SQL查询的结果的机制,显得有些过于臃肿了。因此,在ADO.NET中,Recordset对象的功能将被拆分到三个部分中去。首先是DataReader对象, 它所要完成的功能是将数据简单的表现出来;在ADO中,类似功能是由向前的、服务器端的光标(forward-only, server-side cursor)来实现的。然后是DataSet 和 DataSetCommand 对象,它们能够在客户端创建一个或一个以上的数据集合的缓存,并对它们进行操作。在ADO中,客户端光标的使用相对比较单一化,而在这方面ADO.NET则分别赋予这两个对象不同的功能,从而使它们具有更加专一而强大的功能。最后,是其他一些在ADO中能够实现的功能,比如说,利用Connection对象在保守锁定的情况下进行数据的更新。这是在ADO.NET中无法实现的功能,这意味着在某些时候,ADO将被继续使用。

在进入DataSet的讨论之前,我们先来简单的来看一看ADO.NET。

使用DataReader

ADO.NET提供了三个类:DBConnection, DBCommand 和 DBDataReader,它们与传统的ADO对象十分的相似。但是在.NET应用程序中它们不能被直接使用。能够使用的是从它们继承而来的类,比如ADOConnection, ADOCommand 和 ADODataReader来读取数据,这里的前提是存在一个OLEDB的Provider。如果要操作的对象是SQL Server,那么将使用另一些功能相同的类SQLConnection, SQLCommand 和 SQLDataReader 以便直接通过SQL Server 的 TDS 连接通道来获得更好的工作性能。下面是一个例子(因为在这里C#和VB.NET的代码区别不是很大,所以将只使用VB.NET的实例):

Imports System.Data

Imports System.Data.ADO

..

Dim cn As New ADOConnection()

cn.ConnectionString = strConnect

Try

cn.Open()

Dim cd As New ADOCommand(搒elect * from authors? cn)

Dim dr As ADODataReader

cd.Execute(dr)

While dr.Read()

listbox1.Items.Add(dr(揳u_lname?)

End While

Catch err As Exception

MsgBox(err.ToString)

Finally

If cn.State = DBObjectState.Open Then cn.Close()

End Try

在上面你会发现在While Loop语句中没有出现MoveNext方法,因为DataReader的Read方法将自动前移光标,并会在没有数据的时候返回一个False值。这显然减轻了开发者的工作量。

在两种情况下,DataReader被推荐使用:一、客户界面利用手写代码,或是没有用到数据绑定并且数据的更新是利用手写的SQL语句或是存储过程,这种情况下,DataReader将提供有效的访问相关数据的方法;二、一个需要查看数据库状态的的过程,但不需要实现诸如自动更新的功能。一些比较好的应用实例有向下拉菜单填充数据,以及产品编号的验证。

理解DataSets

对于一些开发者来说,可能会对DataSets的使用颇有微词,但事实上,掌握它并不难。如果你对连接断开的RecordSet 模式,以及分层的RecordSet 的使用不陌生,并且乐于使用一些XML的话,那么利用DataSets 就没有什么困难了。

可是有什么必要去花费时间去重新学习一种对象模型呢?

理由之一是,ADO.NET 力推的断开连接模式(disconnected model)是非常有意义的。断开连接的数据伸缩性更高,因为这种模式对数据服务器的压力比较小。通过平行服务器对中间层进行扩展比对数据层进行扩展要容易的多,因此对于可扩展的应用程序来说,对数据层资源的使用要谨慎。断开连接模式将在这里得到应用。

理由二,在数据管理方面,断开连接模式有非常广阔的前景。

如果说有一种技术的 发展比ADO还要迅速,这就是XML。XML解决了两个ADO所对的局限。

1、XML更加适用与跨平台的的数据传输,因为它能够穿越防火墙。

2、XML比ADO包括它的扩展ADO2.5描述的类型多。一个简单的例子,同样面对扁平的数据,普通的XML将比ADO显示出更高的效率。

DataSets是XML与ADO结合的产物,它的一个重要的特点是与数据库或SQL无关。它只是简单的对数据表进行操作,交换数据或是将数据绑定到用户界面上。

向DataSets中加入数据表的方法有两种:

1、利用DataSetCommand对象,它可以以XML 的形式返回一个数据库查询的结果。在处理数据库更新的时候,这种方法与ADO的客户端光标基本相同,但提供更强的控制。

2、直接对XML数据进行操作。DataSet 对象有对XML数据和Schemas进行读写的的方法,并且可以和XMLDataDocument对象(该对象是多用途XMLDocument类的继承)紧密的结合起来工作,它具有一些对扁平数据操作的特殊函数因此可以作为从DataSet 到通用XML DOM的桥梁。

下面是一段使用DataSet的代码:

Dim dc As New ADODataSetCommand( _

"select au_id, au_fname, au_lname from authors" & _

" where au_lname = ‘Ringer’", strConnect)

Dim ds As New DataSet()

dc.FillDataSet(ds, "Authors")

MsgBox(ds.XmlSchema, , "XML Schema")

MsgBox(ds.XmlData, , "XML Data")

以上的代码将一个‘AUTHORS’数据表填充到DataSet 对象实例 ds 中,并显示了XML数据和Schemas,请看两个显示结果:表1 和 表2

向DataSet中添加数据表的操作是非常容易的,请看下面的代码:

dc = New ADODataSetCommand( _

"select * from titleauthor" & _

" where title_id like 'PS%'", strConnect)

dc.FillDataSet(ds, "Titles")

MsgBox(ds.XmlData, , "XML Data")

表1显示XML Schema

表2显示DataSet 对象生成的数据

未 完 待 续

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有