在这一章,我们主要介绍.NET中的数据访问技术:ADO.NET.
ADO.NET的架构
从图中可以看到,ADO.NET中的类分为两种:
- 1.连接提供程序类(Connection,Command,DataReader等)
- 2.数据类(DataSet,DataTable,DataView等)
- 这两种分类和我在前一章中介绍的组件分类是一致的.
连接提供程序类
不同的数据库,使用不同的Provider来访问数据库..NET框架公开了一组公共的接口,可以让数据库厂商实现自己的Provider.内置的数据Provider有:
1.System.Data.SqlClient(访问Sql Server)
2.System.Data.OracleClient(访问Oracle,不过Oracle自己提供了更好的Privider,叫ODP.NET,建议直接用这个)
3.System.Data.OleDb(用OleDb协议访问数据库)
4.System.Data.Odbc(用Odbc协议访问数据库)
在.NET1.1中,使用工厂模式现实这种Provider模型.如:System.Data.Sqlclient.SqlConnection现实了System.Data.IDbConnection.
在.NET2.0中,使用了抽象工厂现实这种Provider模型.如:System.Data.Sqlclient.SqlConnection继承于System.Data.Common.DbConnection,而System.Data.Common.DbConnection实现了System.Data.IDbConnection.
通过使用工厂,我们很容易编写通用的数据访问代码,而不用考虑后面的数据库.如下面的示例中,你可以将System.Data.SqlClient存在配置文件中,在运行时读取:
var factory = System.Data.Common.DbProviderFactories.GetFactory("System.Data.SqlClient");
var conn = factory.CreateConnection();
var cmd = factory.CreateCommand();
var cmbBuilder = factory.CreateCommandBuilder();
var adp= factory.CreateDataAdapter();
var parm = factory.CreateParameter();
…
要知道自己机器上注册了哪些Provider,可以调用这个访法:
DataTable registeredProviders = System.Data.Common.DbProviderFactories.GetFactoryClasses();
DataSet
简单来说,DataSet就是内存中的数据库.它支持继开式的数据访问和更新.基于Xml存储数据,很容易地序列化/反序列化Xml数据.DataSet这种大粒度的数据访问,很适合在分布式系统中使用.另一个优点是它是基于"集合式"的数据结构,极大地简化了客户端程序的编写.
注意,DataSet(还有DataTable,DataColumn)有一个ExtendedProperties属性,它本质是一个字典一样的东西.你可以存储一些自定义的属性,如DataSet的生成日期,过期日期等.
如:
ds.ExtendedProperties.Add("Expiredate", DateTime.Now.AddHours(8));
ds.ExtendedProperties.Add("Author", "Rock Niu");
DataAdapter
DataSet中的数据怎么从DB拉下来,怎么更新回DB,都得靠DataAdapter(数据适配器),下图是DataAdapter的结构图:
在构造DataAdapter时,通常我们要指定SelectCommand,它用来在DataAdapter.Fill(DataSet)时查询数据.
Update, Insert, Delete这几个Command只在调用DataAdapter.Update(DataSet)时才会用到,它们可以由CommanBuilder帮我们自动生成.不过它动态生成时,会访问表的元数据,且Command中会把所有列放在where条件中,这会影响性能.建议大家自己指定Update, Insert, Delete这几个Command的Text,最好用存储过程,这样性能最好.