第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
实体关系图
我们在设计表的时候,尽量让表与表之间有联系,形成一个连通图。
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的层次
最开始的时候我们在应用程序中编写一些托管的代码,如果有数据库访问的代码的话,它会去访问ADO.NET,ADO.NET会针对不同的数据源的访问对象来选择不同的托管的Provider,最终托管的Provider会去访问Data Store数据源。而我们程序员最需要关心的就是Managed Code部分。
ADO.NET体系结构
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
连接字符串,Server的地址可以是(local)或者是IP地址,Database是数据库的名字,还有是数据库的安全信息,Integrated Security=True表示是集成验证。如果想要混合验证,就把要写UserName和Password。
如果产生异常,并且是Open产生的异常,那么直接释放conn,如果是Open之后产生的异常,那么先关闭连接,然后释放。
运行结果
这是一个Dashboard,中文是汽车的仪表盘。
它实际上是一个WindowsForm,把属性ControlBox设置为False,就可以去掉它的窗体的头。这样感觉它就像一个工具栏一样了。下面是Dashboard的cs代码。
DataReader对象
不同的Provider有使用不同的DataReader
ADO.NET中最高效的得到数据的方法
SqlDataReader
SqlCommand.ExecuteReader()方法
SqlDataReader.Read()方法可以遍历结果集中的行
SqlDataReader按照当前行的列引索可得到每一列的数据,GetString(),GetBoolean(),GetInt16(),GetInt32(),GetDateTime(),GetDecimal(),GetDouble(),GetFloat(),GetGuid()。根据每一列的不同的数据类型,调用不同的Get方法来获得数据。
演示二
SqlDataReader对象
循环读取数据,这里我们用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对象模型
DataView可以对数据进行过滤和排序。ChildRelations和ParentRelations描述外键关系。
演示三
SqlDataAdapter和DataSet对象
调用Fill方法的时候,Adapter会自动调用SelectCommand中规定的Sql语句来进行数据查找,并填充到DataSet中。实际上在调用Fill的时候,Adapter还是去调用了SqlDataReader,然后遍历SqlDataReader所有的行和列,并填充到DataSet中。
运行结果
DataTable对象
Columns属性包含了一个或多个DataColumn对象
Rows属性包含了一个或多个DataRow对象
Contrains属性包含了一个或多个Constraint对象
DataTable中最多能够包含16,777,216行数据
强类型的DataSet
强类型的DataSet就是一个数据结构,这个数据结构中包含了若干数据类型,强类型DataSet对象最终用于在内存中存储数据
可以通过Server Explorer拖拽数据库表来生成
强类型的DataSet将用XSD文件来表述,并可以被转化成一个.NET类
演示四
强类型的DataSet
直接把表拖拽到设计面板,会自动生成两个东西
自动生成新的DataSet
点击OK后会在项目中添加一个xsd文件
SqlDataAdapter的参数属性
控件的数据绑定
最后一个字符串参数必须填写的是dsCustomers的属性。只有强类型的DataSet才可以这样去访问它的属性,如果不是强类型,它是找不到Customers等属性的。
运行结果
数据绑定(Data Binding)
包含DataSource属性的Control可以被绑定
可以将DataTable或DataSet设置给DataSource属性
简单的数据绑定:TextBox,CheckBox
复杂的数据绑定:DataGrid
数据绑定不仅仅局限于DataTable或DataSet
任何实现了IEnumarable接口的类都可以进行数据绑定,包括ArrayList和其他自定义的类型
演示五
数据绑定
指定数据源DataSet,复杂数据绑定
指定数据源StringCollection,复杂数据绑定。StringCollection就是继承自IEnumarable接口的一个集合。
使用DataBinding绑定简单数据
保存数据
这里直接调用UpdateCustomers函数更新信息。我们先用daCustomers的GetChanges方法检查是否DataSet被改变,如果有改变,那么这个方法返回的内容就是改变了的内容。把这些变更内容作为参数传给UpdateCustomers方法。
这里daCustomers的Update方法会根据当前的DataSet的具体信息判断当前这行是增、删还是改,然后根据情况分别调用Insert、Update、Delete的语句。
ADO.NET和XML
DataSet可以直接的串列化为XML,同时XML也可以直接的反串列化为DataSet对象
ReadXml()方法
WriteXml()方法
SqlCommand.ExecuteXmlReader()返回一个XmlReader对象
演示六
XML和ADO.NET
在返回的DataSet中调用WriteXml方法并指定文件路径,就可以把DataSet转化为Xml存到文件中。ReadXml可以把Xml文件读取为DataSet,非常方便。下面是Xml文件内容。
Microsoft Data Access Application Block
包含经过了优化的调用SQL Server数据库中存储过程和SQL语句的代码
可以返回SqlDataReader,DataSet和XmlReader对象
使用它可以降低开发成本,减少需要编写、测试和维护的代码
可以从微软的网站上下载C#和VB.NET的源代码和开发文档
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/daab-rm.asp
这里SqlParameter Array被SqlHelperParameterCache用到。也就是说,我们去调用存储过程的时候,存储过程需要若干个参数,它只有在第一次要用到参数的时候才去向数据库遍历所有参数的具体内容,以后调用相同的存储过程的时候,它就会直接使用Cache中缓存的参数列表,降低程序的开销,提高效率。
代码演示
先添加项目引用
总结
ADO.NET提供了一套丰富的类库和一组通用的接口来访问RDBMS中的数据
特定的provider访问特定的数据源
Connection对象通过不同的provider实现与不同RDBMS的链接
DataAdapter和DataReader对象利用绑定了Connection对象的Command对象访问数据
DataSet中包含了多个DataTable对象和多个DataRelation对象
2010.10.11