阿牛 - 专注.NET开发

如果梦想与实现之间有一道不可逾越的鸿沟,那么“执行力”就是跨越这道鸿沟的桥梁。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

在这一章,我们主要介绍.NET中的数据访问技术:ADO.NET.

ADO.NET的架构

27y4ybxw_ado_2(en-us,VS_71)

从图中可以看到,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这种大粒度的数据访问,很适合在分布式系统中使用.另一个优点是它是基于"集合式"的数据结构,极大地简化了客户端程序的编写.

zb0sdh0b_ado_1(en-us,VS_71)

 

注意,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,最好用存储过程,这样性能最好.

posted on 2009-08-25 10:08  阿牛-专注金融行业开发  阅读(495)  评论(0编辑  收藏  举报