登陆注册
8724600000026

第26章 软件构造(5)

6.4.1ADO.NET的定义

ADO.NET是托管应用程序所使用的数据库语言。它是.NET框架类库的System.Data命名空间和它的子空间提供的一组类。前面提到编程实际上就是管理和操作数据,而ADO.NET就是为管理和操作数据而生的。接下来就一起来探讨如何使用ADO.NET。

6.4.2使用ADO.NET

ADO.NET是.NET框架类库System.Data命名空间中的一组类。它包括了Connection对象、Command对象、DataAdapter对象、DataReader对象、DataSet对象及其他一些辅助对象。

首先先来看一下主要对象有些什么功能和作用。

Connection对象:建立与特定数据源的连接。

Command对象:对数据源执行命令。

DataReader对象:从数据源中读取只能单向前进且只读的数据流。

DataSet对象:DataSet是ADO.NET结构的主要组件,它是从数据源中检索到的数据在内存中的缓存。Data Set由一组Data Table对象组成,使用者可使这些对象与Data Relation对象互相关联。DataTable和Data Relation会在下文中有所介绍。

Data Adapter对象用数据源填充Data Set并解析更新。当然,还有一些很常用的对象,如Parameters对象和Command Builder对象。

Parameters对象定义命令和存储过程的输入、输出和返回值参数。而Command Builder对象将自动生成Data Adapter的命令属性或将从存储过程导出参数信息并填充Command对象的Parameters集合。这些对象究竟如何工作会在下面的文字中叙述。

若要在数据库中执行操作,应执行SQL语句或存储过程(它包括SQL语句)。可以使用SQL语句或存储过程读写行并执行聚合函数,例如添加或求平均值;还可使用SQL语句或存储过程创建或修改表或列、执行事务等。

在ADO.NET中,使用数据命令打包SQL语句或存储过程。例如,如果想要从数据库读取一组行,则创建一个数据命令并用SQLSelect语句的文本或获取记录的存储过程的名称配置它。所有使用ADO.NET与数据库进行交互,不管是显式的还是隐式的,都会牵扯到连接和命令对象。连接对象代表和数据库的物理连接;命令对象代表对数据库执行的命令操作。

这里给出了在ADO.NET中执行数据库命令的规范操作模式,规范操作模式如下。

①创建一个封装连接字符串的连接对象。

②调用连接对象的Open方法打开连接。

③创建一个封装SQL命令和连接的命令对象。

④调用命令对象的方法来执行该命令。

⑤调用连接对象的Close方法关闭连接。

下面提出几个能帮助大家解决数据库交互的操作:

1.如何设置数据库连接

在操作数据库之前,必须打开一个指向它的连接,由SqlConnection类代表了指向SQL Server数据库的连接。在Sql Connection类中有一个属性Connection String,存储了连接字符串。下面的语句创建了一个Sql Connection对象,并用一个连接字符串初始化。

Dim My Connection As New SqlConnection

My Connection.ConnectionString=”server=( localhost);database=ComponentSystem;Trusted_Connection=yes”)

只是创建一个Connection对象和提供一个连接字符串并没有打开一个指向数据库的物理连接,调用对象的Open方法才可能做到这一点。当然,在调用完数据库后别忘了用close方法关闭数据库。如果不能建立一个指向数据库的连接,SqlConnection.Open就会引发一个SqlException异常。

Try

My Connection.Open()

//TODO使用此连接

catch(ex as Sql Exception)

finally

My Connection.Close()

End Try

2.如何插入数据

一个打开的指向数据库的连接如果不用来执行命令就失去了意义,下面就来说一下命令类SqlCommand。SqlCommand实现了一些方法,可以调用这些方法来执行命令,如果是查询命令,会得到一个封装结果的DataReader对象。调用的方法和返回的结果取决于所要执行的命令。举例来说明:

Dim My Command As SqlCommand

My Command=New Sql Command(”Insert into tb_ClassBase(ClassId,ClassBaseID)values(+ClassID+,+lblBaseID.Text+)”,My Connection)

My Command.Execute NonQuery

当然还可以用命令对象的Command Timeout属性来指定命令执行的超时时间。

My Command.Command Timeout=10//保持连接10秒

Execute Non Query方法用来执行Insert、Update、Delete和其他没有返回值的SQL命令,它返回被命令影响的行数。ExecuteScalar方法执行一个SQL命令并返回结果集的第一列的第一行,它一般都用来执行SQL的COUNT、AVG、MIN、MAX和SUM函数,这些函数都是返回单行单列的结果集。

3.如何删除数据

同理定义一个命令对象SqlCommand。举例来说明:

Dim My Command As SqlCommand

My Command=New SqlCommand(”Delete from tb_Author where tb_Author=12”,_My Connection)

My Command.Execute NonQuery

4.如何更新数据

也同样是定义一个命令对象Sql Command。举例来说明:

Dim My Command As SqlCommand

My Command=New Sql Command(”update tb_componentbasicinformation set componentintroduction="”+txtcompintro.Text+”",componentcategoryid="”+category+”",toolid="”+tool+”",producttypeid="”+ product+”",componentfunctionid="”+funct+”",functionintroduction="”+txtfuncintro.Text+”"where componentid="”+lblcompid.Text+”"”,MyConnection)

My Command.Execute Non Query

5.如何查询数据

用来压轴的方法是Execute Reader,不为别的,因为它的使用频率最高。它能很快地对数据库进行查询并得到结果。ExecuteReader返回一个Data Reader对象,它可以作为一些数据类控件的数据源。一个查询操作可能产生几百万条记录,但是可以使用DataReader只读取其中的10条,这样只有部分结果集被返回,提高了性能。

下面是一个把从数据库中查询出来的数据作为一个下拉框控件的数据源的例子。先定义了一个名为sql的SQL查询字符串,然后建立一个Sql Command命令对象,并把刚才定义的sql作为参数传入Sql Command对象。接下来就是执行Execute Reader方法,得到一个DataReader对象。

sql=”Select producttypename From tb_producttype”

cmd=New SqlCommand(sql,conn)

rd=cmd.ExecuteReader

ddlprodtype.Items.Clear()

Do While rd.Read

ddlprodtype.Items.Add(rd(”producttypename”))

Loop

rd.Close()

ADO.NET的DataReader对数据库查询结果的基于流的访问,在只读记录集中只能以向前方式移动。用户不能退回去重读前一条记录,也不能改变查询结果并把它们写回数据库。于是,ADO.NET提供了基于集的访问。基于集的访问把整个查询结果记录在内存的缓存中,我们可以从任意方向访问并随意作出修改。

基于集的访问类是DataSet,它相当于内存中的数据库。而实际的数据存储在DataTable里,它是内存中的数据表。相对应的还有Data Row和Data Column。

DataSet通常是通过数据库查询或者XML文档来初始化的。DataSet不与数据库直接交互,而是由DataAdapter完成这项工作。

DataAdapter最重要的方法是Fill和Update。前者查询数据库并对结果初始化Dataset,后者把更改写回到数据库。

先给出一个例子:

Dim MyConnection As Sql Connection

Dim MyCommand As Sql DataAdapter

MyConnection=New Sql Connection(”server=( localhost);atabase=Component System;Trusted_Connection=yes”)

MyCommand=New Sql DataAdapter(”select AuthorID,AuthorName from tb_Author”,MyConnection)

Dim ds As DataSet

ds=New DataSet()

MyCommand.Fill(ds,”tb_Author”)

Mydatagrid.DataSource=ds.Tables(”tb_Author”).DefaultView

Mydatagrid.DataBind()

这段代码完成了很多工作。传递给DataAdapter的构造函数的查询字符串对指定的数据库执行查询;在Dataset中创建一个名为tb_Author的表;用数据库中的tb_Author表的架构初始化Data Table;检索由查询产生的所有记录,并把它们写入Data Table中;关闭指向数据库的连接。

在DataTable中执行插入、更新和删除操作并不会自动写回数据库。如果想把更改写回数据库必须手动完成。

Dim myConn As New SqlConnection(myConnection)

Dim myDataAdapter As New SqlDataAdapter()

myDataAdapter.SelectCommand=New SqlCommand(mySelectQuery,myConn)

Dim custCB As SqlCommandBuilder=New SqlCommandBuilder(myDataAdapter)

myConn.Open()

Dim custDS As DataSet=New DataSet

myDataAdapter.Fill(custDS)

myDataAdapter.Update(custDS)

myConn.Close()

CreateCmdsAndUpdate=custDS

至于Update怎样更新数据库的,在这里就不单独叙述了。在这里要提醒一点,在用SqlDataAdapter进行大量数据库的更新操作时,如果想提高性能,应该将数据库的更新操作编写在存储过程中,将这些存储过程包装在SqlCommand对象里,然后把这些对象赋值给InsertCommand、UpdateCommand或DeleteCommand属性。ADO.NET也支持视图概念。用DataView表示。它支持排序和筛选,可以用DataView的sort属性或rowFilter属性。那么有人也许要问,什么时候使用DataReader,而什么时候又该用DataSet呢?

在以下场合下考虑使用DataReader。

①当应用程序要求优化只读以及前向数据访问(如绑定Repeater控件)时,DataReader是一个更好的选择。当数据从DataReader“卸下”来时,就关闭连接,这对提供程序的性能有帮助。

同类推荐
  • 音视频合成制作

    音视频合成制作

    本书共分4篇6章,其中第1篇简介音视频合成的编导基础,第2篇主要介绍SonyCinescore1电影音乐自动合成,第3篇主要介绍Vegas7.0音视频剪辑合成,第4篇主要介绍AdobeAudition2.0、CakewalkSONAR6和SteinbergNuendo3的音视频合成。本书可以作为音乐、美术、动画、舞蹈、影视、戏剧等艺术院校视听艺术合成制作课程的教材,也可以作为相关人员的自学用书。
  • EDA技术

    EDA技术

    根据课堂教学和实验操作的要求,以提高实际工程设计能力为目的,深入浅出地对EDA技术相关知识作了系统和完整的介绍,相关知识作了系统和完整的介绍。
  • 中国移动智能手机的秘密

    中国移动智能手机的秘密

    《中国移动智能手机的秘密》是一本关于移动终端和移动互联网的科普书。作者将这18年通信行业中的学习、思考、实践积累成《中国移动智能手机的秘密》与大家分享。书本系统总结了手机的发展历史、TD产业界“从2G向3G演进”的移动终端产业分化重组进程、智能手机的使用方法用方法和应用指南,以及对移动互联网发展独特思考。
  • 多媒体技术

    多媒体技术

    多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术
  • 网络广告经纪人

    网络广告经纪人

    本书为网络广告经纪人培训认证的指定教材,该认证是商务部中国商务广告协会和信息产业部中国电子商会联合推出的,旨在为国家造就和培养出一大批网络广告梯队型人才。该教材包括网络广告经纪人的介绍和发展趋势,以及网络广告的原理、策划、设计、制作、发布与交换、效果评估、管理,以及网络广告营销的国内外最新的成功案例,还提供了一些常用的网络广告制作工具。本教材适合助理网络广告经纪人和网络广告经纪人层次使用。也可作为高校广告、电子商务等专业的教材。
热门推荐
  • 名派密事

    名派密事

    许祯从一个女贼一路奋斗,终成一代女侠。 但她这辈子最遗憾的事情是亲手将林义拽进了这个水深火热的江湖漩涡中,从此,物是人非,昔日亲如兄妹,今日倒戈相向。敲黑板:这是个内敛深情男主和女主谈恋爱,除邪教,平江湖的热血故事。架空,勿考据。
  • 咫距一寸

    咫距一寸

    一直崇尚现实主义的女孩赵艺涵自认为是生活的卑微者,她认为她的生活一直是黑白交换,从未出现过其他耀眼的色彩,她甘于寂寞,甘于孤独,但不甘于被轻视。18岁那年,意外的人生转折不得不让她学会迅速成长,从被瞧不起到成为被仰慕的对象,本来是一件值得自豪的事情,可是当曾经憧憬的一切变成事实后,她却怎么也开心不起来。如果可以再次选择,她宁愿回到那个不起眼的村庄去,平平淡淡地过。但是一切已成事实,你不勇敢,没人为你的懦弱埋单。她用极具睿智的方式游刃在被操纵的人生里,试图一次又一次地冲破障碍,去寻找属于自己的幸福。
  • 龙骑士的奇幻冒险

    龙骑士的奇幻冒险

    风雨飘摇的阿尔特里亚大陆上,一位普通的农家少女木汐的成长史,在大陆冒险的过程中,遇到了杰兰特、贝斯柯德、卡拉秋、内尔文、特拉玛依、巴尔纳等伙伴,一起开天辟地,维护世界和平。
  • 天行

    天行

    号称“北辰骑神”的天才玩家以自创的“牧马冲锋流”战术击败了国服第一弓手北冥雪,被誉为天纵战榜第一骑士的他,却受到小人排挤,最终离开了效力已久的银狐俱乐部。是沉沦,还是再次崛起?恰逢其时,月恒集团第四款游戏“天行”正式上线,虚拟世界再起风云!
  • tfboys半岛初晴

    tfboys半岛初晴

    啊!安筱沐的妈妈居然和王俊凯的妈妈认识,还有,还有……
  • 天行

    天行

    号称“北辰骑神”的天才玩家以自创的“牧马冲锋流”战术击败了国服第一弓手北冥雪,被誉为天纵战榜第一骑士的他,却受到小人排挤,最终离开了效力已久的银狐俱乐部。是沉沦,还是再次崛起?恰逢其时,月恒集团第四款游戏“天行”正式上线,虚拟世界再起风云!
  • 天行

    天行

    号称“北辰骑神”的天才玩家以自创的“牧马冲锋流”战术击败了国服第一弓手北冥雪,被誉为天纵战榜第一骑士的他,却受到小人排挤,最终离开了效力已久的银狐俱乐部。是沉沦,还是再次崛起?恰逢其时,月恒集团第四款游戏“天行”正式上线,虚拟世界再起风云!
  • 叶无言

    叶无言

    她叫祁羽夏。他叫叶一。夏天快结束的时候相遇。秋天快到来的时候重逢。吟一曲冬天的尾声。又一个春天,我想起了你的话,一切,都会好好的。
  • 兽回录

    兽回录

    男主林锋被系统带到一个奇怪的大陆。大陆上的人类被妖兽压制着,人类的诸神逃到附属世界或被封印,兽神们的统治造成了混乱。林锋的任务便是改变这世间,让即将毁灭的世界回到原来的轨迹。
  • 左手时空,右手苍穹

    左手时空,右手苍穹

    曾经志在千里,马踏穹霄的少年,对不起,我让你失望了。我曾放下一切踏上追寻所谓的“伟大”的征途。但是后来,蓦然回首,才发现自己失去了多么重要的东西。转身看着儿时幼稚懵懂开心的自己,明明身隔波澜壮阔的岁月长河,越过无数人群相互对视,还是能在那一刹那便潸然泪下,悲伤转瞬间逆流成河。再也回不去了,再也忘不掉了。有时候,命运,就是如此讽刺。