第8讲:ADO.NET为应用程序提供高性能的数据访问技术

2005.1.13 欧岩亮

课程简介

介绍Microsoft ADO.NET的使用基础

ADO.NET——高效的数据访问技术

 

基础

熟悉Microsoft .NET

关系型数据库管理系统(RDBMS)

 

课程内容

RDBMS的基本概念

ADO.NET——标准的数据访问API

Provider:数据的提供源

Connection和 Command

DataAdapter和DataReader

DataSet:轻量级数据存储空间

强类型的DataSet

数据绑定

Data Access Application Block

 

RDBMS基本概念

在表中存储数据的数据库,例如Microsoft SQL Server,Microsoft Access等

表具有数据列和数据行

范式,数据标准化

表之间使用外键约束相互关联

支持数据操作语言(DML)

SELECT,INSERT,UPDATE和DELETE

 

实体关系图

image

我们在设计表的时候,尽量让表与表之间有联系,形成一个连通图。

 

ADO.NET提供标准的CRUD接口

CRUD——Create Retrieve Update and Delete

Microsoft .NET中ADO.NET来提供这些功能

ADO.NET中托管的Provider

调用标准的CRUD语句来访问数据库

ADO.NET将不同的Provider的数据库访问方式抽象出来提供统一的访问接口

System.Data名称空间

 

Provider

Provider是一些托管的应用程序集

包含了对特定数据源的访问代码

SQL(7+,即2000以上) provider:System.Data.SqlClient名称空间

OLE/DB provider:System.Data.OleDb

ODBC provider:System.Data.Odbc

Oracle provider:System.Data.OracleClient

 

ADO.NET的层次

image

最开始的时候我们在应用程序中编写一些托管的代码,如果有数据库访问的代码的话,它会去访问ADO.NET,ADO.NET会针对不同的数据源的访问对象来选择不同的托管的Provider,最终托管的Provider会去访问Data Store数据源。而我们程序员最需要关心的就是Managed Code部分。

 

ADO.NET体系结构

image

ADO.NET最核心的类是DataSet。DataSet提供了存储数据的可能,它需要通过不同的DataProvider来进行数据填充。不同的DataProvider提供了不同的Connection。Connection可以具有事务能力。DataProvider中可以有特定的Command,可以传入参数。DataProvider中还有读取数据的DataReader以及适配器DataAdapter,适配器有4个关键的命令。DataAdapter实际上是利用了左边的Connection、Command、DataReader实现了离线的DataSet数据与Database之间的数据同步。所谓同步,即当Database数据变更了,DataAdapter可以把它读到DataSet当中;当DataSet中数据发生变化,DataAdapter可以把变更的数据同步到Database。

DataSet里面包含了一个DataTable的列表。DataSet还包含了DataRelationCollection。DataRelation用来描述DataSet中不同的DataTable之间的外键关系。

 

Connection对象

对于不同的Data Provider有不同的Connection对象

System.Data.SqlClient

SqlConnection

Open()方法——SQL Provider使用它来与SQL Server7+数据库进行连接

ConnectionString属性——指定连接字符串参数

 

Command对象

SqlCommand对象

CommandText属性——指定需要执行的DML命令,来操纵数据

Connection属性——为SqlCommand对象指定SqlConnection对象

SqlParameters属性(Collection)——包含了一组Command对象的参数

ExecuteNonQuery()方法

ExecuteScalar()方法——从DML语句中只返回一个单独的值,返回结果集中的第一行第一列

ExecuteReader()方法——返回一个SqlDataReader

 

要注意的是,我们不能直接用Command对象填充DataSet,而是需要DataAdapter来填充。

 

演示一

SqlConnection和SqlCommand对象

 

NorthwindDataAccess.cs

image

连接字符串,Server的地址可以是(local)或者是IP地址,Database是数据库的名字,还有是数据库的安全信息,Integrated Security=True表示是集成验证。如果想要混合验证,就把要写UserName和Password。

image

如果产生异常,并且是Open产生的异常,那么直接释放conn,如果是Open之后产生的异常,那么先关闭连接,然后释放。

运行结果

image

这是一个Dashboard,中文是汽车的仪表盘。

image

它实际上是一个WindowsForm,把属性ControlBox设置为False,就可以去掉它的窗体的头。这样感觉它就像一个工具栏一样了。下面是Dashboard的cs代码。

image

 

DataReader对象

不同的Provider有使用不同的DataReader

ADO.NET中最高效的得到数据的方法

SqlDataReader

SqlCommand.ExecuteReader()方法

SqlDataReader.Read()方法可以遍历结果集中的行

SqlDataReader按照当前行的列引索可得到每一列的数据,GetString(),GetBoolean(),GetInt16(),GetInt32(),GetDateTime(),GetDecimal(),GetDouble(),GetFloat(),GetGuid()。根据每一列的不同的数据类型,调用不同的Get方法来获得数据。

 

演示二

SqlDataReader对象

image

循环读取数据,这里我们用GetString是因为我们知道数据里面的值全部都是String,即使不是String类型,系统也会为我们执行ToString()方法返回String,所以使用GetString方法一定会成功。

 

DataAdapter对象

与Provider相关

与select,update,insert,delete命令进行互操作

SqlDataAdapter

InsertCommand属性

UpdateCommand属性

DeleteCommand属性

SelectCommand属性

Fill()方法——需要一个DataSet类型的参数

Update()方法——将DataSet中的变更提交到数据库当中,需要使用InsertCommand,UpdateCommand和DeleteCommand。

在拖拽DataAdapter向导的时候,IDE环境替你生成了默认的InsertCommand,UpdateCommand和DeleteCommand命令。这个时候,当你的DataSet数据变更以后,它有一个机制会把DataSet中的实参与命令中的形参做对应。然后你去调用SqlDataAdapter的Update方法的时候,SqlDataAdapter才知道把DataSet中的哪一行哪一列数据填到形参的地方,并且SqlDataAdapter会到DataSet的每一行每一列去遍历,并作相应的设置。

 

DataSet对象

独立于数据Store、Provider和Connection

离线模型

Tables属性包含了一个或多个DataTable对象

Relations属性可以包含一个或多个DataRelation对象

可以用DataAdapter对象来填充

可以与XML相互转换(XML文件同样可以作数据源)

将变更之后的DataSet提交到DataAdapter的Update()方法

 

DataSet对象模型

image

DataView可以对数据进行过滤和排序。ChildRelations和ParentRelations描述外键关系。

 

演示三

SqlDataAdapter和DataSet对象

image

调用Fill方法的时候,Adapter会自动调用SelectCommand中规定的Sql语句来进行数据查找,并填充到DataSet中。实际上在调用Fill的时候,Adapter还是去调用了SqlDataReader,然后遍历SqlDataReader所有的行和列,并填充到DataSet中。

运行结果

image

 

DataTable对象

Columns属性包含了一个或多个DataColumn对象

Rows属性包含了一个或多个DataRow对象

Contrains属性包含了一个或多个Constraint对象

DataTable中最多能够包含16,777,216行数据

 

强类型的DataSet

强类型的DataSet就是一个数据结构,这个数据结构中包含了若干数据类型,强类型DataSet对象最终用于在内存中存储数据

可以通过Server Explorer拖拽数据库表来生成

强类型的DataSet将用XSD文件来表述,并可以被转化成一个.NET类

 

演示四

强类型的DataSet

image

直接把表拖拽到设计面板,会自动生成两个东西

image

image

自动生成新的DataSet

image

点击OK后会在项目中添加一个xsd文件

image

image image

 image

SqlDataAdapter的参数属性

image

image

控件的数据绑定

image

最后一个字符串参数必须填写的是dsCustomers的属性。只有强类型的DataSet才可以这样去访问它的属性,如果不是强类型,它是找不到Customers等属性的。

运行结果

image

 

数据绑定(Data Binding)

包含DataSource属性的Control可以被绑定

可以将DataTable或DataSet设置给DataSource属性

简单的数据绑定:TextBox,CheckBox

复杂的数据绑定:DataGrid

数据绑定不仅仅局限于DataTable或DataSet

任何实现了IEnumarable接口的类都可以进行数据绑定,包括ArrayList和其他自定义的类型

 

演示五

数据绑定

image

image

指定数据源DataSet,复杂数据绑定

image

image

指定数据源StringCollection,复杂数据绑定。StringCollection就是继承自IEnumarable接口的一个集合。

image

使用DataBinding绑定简单数据

 

保存数据

image

image

这里直接调用UpdateCustomers函数更新信息。我们先用daCustomers的GetChanges方法检查是否DataSet被改变,如果有改变,那么这个方法返回的内容就是改变了的内容。把这些变更内容作为参数传给UpdateCustomers方法。

image

这里daCustomers的Update方法会根据当前的DataSet的具体信息判断当前这行是增、删还是改,然后根据情况分别调用Insert、Update、Delete的语句。

 

ADO.NET和XML

DataSet可以直接的串列化为XML,同时XML也可以直接的反串列化为DataSet对象

ReadXml()方法

WriteXml()方法

SqlCommand.ExecuteXmlReader()返回一个XmlReader对象

 

演示六

XML和ADO.NET

image

在返回的DataSet中调用WriteXml方法并指定文件路径,就可以把DataSet转化为Xml存到文件中。ReadXml可以把Xml文件读取为DataSet,非常方便。下面是Xml文件内容。

image

 

Microsoft Data Access Application Block

包含经过了优化的调用SQL Server数据库中存储过程和SQL语句的代码

可以返回SqlDataReader,DataSet和XmlReader对象

使用它可以降低开发成本,减少需要编写、测试和维护的代码

可以从微软的网站上下载C#和VB.NET的源代码和开发文档

http://www.microsoft.com/downloads/details.aspx?FamilyId=F63D1F0A-9877-4A7B-88EC-0426B48DF275&displaylang=en

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/daab-rm.asp

image

这里SqlParameter Array被SqlHelperParameterCache用到。也就是说,我们去调用存储过程的时候,存储过程需要若干个参数,它只有在第一次要用到参数的时候才去向数据库遍历所有参数的具体内容,以后调用相同的存储过程的时候,它就会直接使用Cache中缓存的参数列表,降低程序的开销,提高效率。

 

代码演示

image

先添加项目引用

image

 

总结

ADO.NET提供了一套丰富的类库和一组通用的接口来访问RDBMS中的数据

特定的provider访问特定的数据源

Connection对象通过不同的provider实现与不同RDBMS的链接

DataAdapter和DataReader对象利用绑定了Connection对象的Command对象访问数据

DataSet中包含了多个DataTable对象和多个DataRelation对象

2010.10.11

posted @ 2010-10-12 00:19  山天大畜  阅读(1947)  评论(0编辑  收藏  举报