工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛
您的位置:软件 > 开发者网络 > 微软开发专栏 > 技术专题 > 正文
ADO.NET实现应用程序数据访问层
[文章信息]
作者:Dan Fox
时间:2005-03-16
出处:MSDN
责任编辑:方舟
[文章导读]
实现数据访问功能是大多数使用.NET Framework的开发人员的核心工作
advertisement
热点推荐
· Easy Go Back帮你用好鼠标手势
· 3月15日软件精选 欣赏优美的代码
· Word窗口主要元素的显示和隐藏
· 提高Windows内存效率的几种方法
· 完美的C++:C++/CLI
[正文]

上一页  1 2 3 4  

  规则5:抽象化.NET Framework data provider

  最后一个规则指定,为什么应该对在DAL内部使用的.NET Framework data provider抽象化,以及应该如何进行抽象。正如我已经提到的那样,ADO.NET编程模型公开了独特的.NET Framework data provider,包括SqlClient、OleDb和其他可从 MSDN 在线Web站点上获得的data provider。尽管该设计能够提高性能,并且使provider能够公开特定于数据源的功能(例如SqlCommand对象的ExecuteXmlReader方法),但它会迫使开发人员决定针对哪个provider进行编码。换句话说,开发人员通常选择使用SqlClient或OleDb,然后直接针对各个命名空间中的类编写代码。

public enum ProviderType : int {SqlClient = 0, OLEDB = 1}

public class ProviderFactory {

 public ProviderFactory(ProviderType provider) {
  _pType = provider;
  _initClass();
 }

 public ProviderFactory() {
  _initClass();
 }

 private ProviderType _pType = ProviderType.SqlClient;
 private bool _pTypeSet = false;
 private Type[] _conType, _comType, _parmType, _daType;

 private void _initClass() {
  _conType = new Type[2];
  _comType = new Type[2];
  _parmType = new Type[2];
  _daType = new Type[2];

  // Initialize the types for the providers
  _conType[(int)ProviderType.SqlClient] = typeof(SqlConnection);
  _conType[(int)ProviderType.OLEDB] = typeof(OleDbConnection);
  _comType[(int)ProviderType.SqlClient] = typeof(SqlCommand);
  _comType[(int)ProviderType.OLEDB] = typeof(OleDbCommand);
  _parmType[(int)ProviderType.SqlClient] = typeof(SqlParameter);
  _parmType[(int)ProviderType.OLEDB] = typeof(OleDbParameter);
  _daType[(int)ProviderType.SqlClient] = typeof(SqlDataAdapter);
  _daType[(int)ProviderType.OLEDB] = typeof(OleDbDataAdapter);
 }

 public ProviderType Provider {
  get {
   return _pType;
  }
  set {
   if (_pTypeSet) {
    throw new ReadOnlyException("Provider already set to " + _pType.ToString());
   }
   else {
    _pType = value;
    _pTypeSet = true;
   }
  }
 }

 public IDataAdapter CreateDataAdapter(string commandText,IDbConnection connection) {
  IDataAdapter d;
  IDbDataAdapter da;

  d = (IDataAdapter)Activator.CreateInstance(_daType[(int)_pType], false);
  da = (IDbDataAdapter)d;
  da.SelectCommand = this.CreateCommand(commandText, connection);
  return d;
 }

 public IDataParameter CreateParameter(string paramName, DbType paramType) {
  IDataParameter p;
  p = (IDataParameter)Activator.CreateInstance(_parmType[(int)_pType], false);
  p.ParameterName = paramName;
  p.DbType = paramType;
  return p;
 }

 public IDataParameter CreateParameter(string paramName, DbType paramType, Object value) {
  IDataParameter p;
  p = (IDataParameter)Activator.CreateInstance(_parmType[(int)_pType], false);
  p.ParameterName = paramName;
  p.DbType = paramType;
  p.Value = value;
  return p;
 }

 public IDbConnection CreateConnection(string connect) {
  IDbConnection c;
  c = (IDbConnection)Activator.CreateInstance(_conType[(int)_pType], false);
  c.ConnectionString = connect;
  return c;
 }

 public IDbCommand CreateCommand(string cmdText, IDbConnection connection) {
  IDbCommand c;
  c = (IDbCommand)Activator.CreateInstance(_comType[(int)_pType], false);
  c.CommandText = cmdText;
  c.Connection = connection;
  return c;
 }
}
             图7 Provider Factory

  如果您要更改.NET Framework data provider,则需要重新编写数据访问方法的代码。为了避免这种情况,可以使用称为“抽象工厂(Abstrace Factory)”的设计模式。使用该模式,可以生成一个简单的类,该类将公开能够基于标识传入到构造函数的.NET Framework data provider的信息来创建主要的.NET Framework data provider对象(命令、连接、数据适配器和参数)的方法。图7中的代码显示了该类的一个简化的C#版本。为了使用该类,数据访问类中的代码需要针对.NET Framework data provider实现的各种接口(包括IDbCommand、IDbConnection、IDataAdapter和IDataParameter)进行编程。例如,为了用来自参数化存储过程的结果填充DataSet,您可以在数据访问类的方法内部使用以下代码:

Dim _pf As New ProviderFactory(ProviderType.SqlClient)
Dim cn As IDbConnection = _pf.CreateConnection(_connect)
Dim da As IDataAdapter = _pf.CreateDataAdapter("usp_GetBook", cn)

Dim db As IDbDataAdapter = CType(da, IDbDataAdapter)
db.SelectCommand.CommandType = CommandType.StoredProcedure
db.SelectCommand.Parameters.Add(_pf.CreateParameter("@productId", _
DbType.Int32, id))

Dim ds As New DataSet("Books")
da.Fill(ds)

  通常,您需要在类级别声明ProviderFactory变量,并且在数据访问类的构造函数中将其实例化。另外,就像这里显示的那样,它的构造函数将用从配置文件中读取的data provider填充,而不是硬编码。如您想像的那样,将ProviderFactory添加到DAL基类中会非常美妙,然后可以将它包含在程序集中并分发给其他开发人员。您还可以更深入一步,以封装开发人员反复编写的常见ADO.NET代码。实际上,Microsoft已经发布了一个能够为SQL Server执行该功能的数据访问应用程序块(参见《Data Access Application Block Overview》, http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/daab-rm.asp)。

  小结

  身处于Web Service时代之中,我们会构建越来越多的应用程序—从独立的应用层来操纵数据。如果您遵循某些基本规则并最终将其作为一种习惯,那么编写数据访问代码会变得更快、更容易并且代码也会具有更高的可重用性,从而节省了与服务器之间的交互并使您在代码中保持数据的独立。

上一页  1 2 3 4  

天极社区邀请您:写博客日记  上传相片   论坛聊天  订阅电子杂志  推荐网摘   免费图铃工具
笔名:   请您注意:

 遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。

 天极网拥有管理笔名和留言的一切权利。
评论:
 
发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容焦点新闻
  • ADO.NET2.0的十大新特性
  • 使用ADO.NET的最佳实践
  • ADO.NET实用技巧两则
  • DataSet的数据并发异常处理
  • 使用ADO.NET设计数据库应用程序
  • 3家搜索引擎集体诉讼8848 吕春维未敢出席
  • 杨元庆:没有准备不会获批的备用方案
  • 【315】华硕笔记本电脑漏电 存在设计缺陷
  • 军队信息化诞生新领域 电子军务呼之欲出
  • 世界经济论坛公布信息化程度全球最新排名
  • 2004政务绩效评估:政府门户尚处于发展阶段
  • 甲骨文出资5.15亿美元 意图收购RetekInc
  • 技术并购:帮你突破传统增长的“天花板”
  • Advertisement