求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
 
MBSE UML基础 UML应用
过程改进 UML代码 python
CMMI 方法与模式 编译原理
架构 运营管理 数据库
质量管理 项目管理 数据仓库
测试 研发管理 数据挖掘
大数据 移动端开发 Devops
界面设计 企业架构 微服务
产品管理 需求 人工智能
JAVA web开发 安全
C/C++ 云计算 嵌入式
.NET SOA 网络技术
集成构建 IT运维 编码规范
配置管理 IT规划 文档模板
网站建设 IT成长 工程基础
 
          WebSharp
首页
文档
    前言
    Websharp DAO
    Websharp ORM
    Websharp AOP
    结束语
API接口 
相关服务
 

       Websharp的数据库访问层

1.数据库访问

       数据库访问技术,在.Net中,微软提供的基础技术是ADO.NetADO.NET 是基于 .NET 的应用程序的数据访问模型。可以使用它来访问关系数据库系统(如 SQL Server 2000Oracle)和其他许多具有 OLE DB ODBC 提供程序的数据源。在某种程度上,ADO.NET 代表 ADO 技术的最新进展。不过,ADO.NET 引入了一些重大变化和革新,旨在解决 Web 应用程序的松耦合特性以及在本质上互不关联的特性。

ADO.NET 依赖于 .NET 数据提供程序的服务。这些提供程序提供对基础数据源的访问,并且包括五个主要对象(ConnectionCommandDataSetDataReader DataAdapter)。

目前,ADO.NET 随附了两类提供程序:Bridge 提供程序和 Native 提供程序。通过 Bridge 提供程序(如那些为 OLE DB ODBC 提供的提供程序),可以使用为以前的数据访问技术设计的数据库。Native 提供程序(如 SQL Server Oracle 提供程序)通常能够提供性能方面的改善,部分原因在于少了一个抽象层。

l             SQL Server .NET 数据提供程序。这是一个用于 Microsoft SQL Server 7.0 和更高版本数据库的提供程序。它被进行了优化以便访问 SQL Server,并且它通过使用 SQL Server 的本机数据传输协议来直接与 SQL Server 进行通讯。 当连接到 SQL Server 7.0 SQL Server 2000 时,应当始终使用该提供程序。

l             Oracle .NET 数据提供程序。用于 Oracle .NET 框架数据提供程序通过 Oracle 客户端连接软件支持对 Oracle 数据源的数据访问。该数据提供程序支持 Oracle 客户端软件版本 8.1.7 及更高版本。

l             OLE DB .NET 数据提供程序。这是一个用于 OLE DB 数据源的托管提供程序。它的效率要比 SQL Server .NET 数据提供程序稍微低一些,因为它在与数据库通讯时通过 OLE DB 层进行调用。请注意,该提供程序不支持用于开放式数据库连接 (ODBC) OLE DB 提供程序 MSDASQL。对于 ODBC 数据源,请改为使用 ODBC .NET 数据提供程序(稍后将加以介绍)。

l             ODBC .NET 数据提供程序。用于 ODBC .NET 框架数据提供程序使用本机 ODBC 驱动程序管理器 (DM) 来支持借助于 COM 互操作性进行的数据访问。

还有其他一些目前正处于测试阶段的 .NET 数据提供程序。

与各个 .NET 数据提供程序相关联的类型(类、结构、枚举等)位于其各自的命名空间中:

l         System.Data.SqlClient:包含 SQL Server .NET 数据提供程序类型。

l         System.Data.OracleClient包含 Oracle .NET 数据提供程序。

l         System.Data.OleDb包含 OLE DB .NET 数据提供程序类型。

l         System.Data.Odbc包含 ODBC .NET 数据提供程序类型。

l         System.Data包含独立于提供程序的类型,如 DataSet DataTable    

在各自的关联命名空间内,每个提供程序都提供了对 ConnectionCommandDataReader DataAdapter 对象的实现。SqlClient 实现的前缀为“Sql”,而 OleDb 实现的前缀为“OleDb”。例如,Connection 对象的 SqlClient 实现是 SqlConnection,而 OleDb 实现则为 OleDbConnection。同样,DataAdapter 对象的两个实现分别为 SqlDataAdapter OleDbDataAdapter

2Websharp对数据库访问层的封装

在应用程序的设计中,数据库的访问是非常重要的,我们通常需要将对数据库的访问集中起来,以保证良好的封装性和可维护性。我们希望在编写应用系统的时候,不因这么多类的不同而受到影响,能够尽量做到数据库无关,当后台数据库发生变更的时候,不需要更改客户端的代码。这就需要我们在实际开发过程中将这些数据库访问类再作一次封装。下面,我们将讨论在Websharp中的做法。

Websharp中,数据访问的主要接口是DataAccess,这个类的定义如下:

     public interface DataAccess

     {

         #region Support Property & Method

         DatabaseType DatabaseType{get;}

         IDbConnection DbConnection{get;}

         IDbTransaction BeginTransaction();

         void Open();

         void Close();

         bool IsClosed{get;}

 

         #endregion

 

         #region ExecuteNonQuery

 

         int ExecuteNonQuery(CommandType commandType, string commandText);

         int ExecuteNonQuery(string commandText);

         int ExecuteNonQuery(string commandText, QueryParameterCollection commandParameters);

         int ExecuteNonQuery(CommandType commandType, string commandText, QueryParameterCollection commandParameters);

 

         #endregion ExecuteNonQuery

          //……因篇幅的原因,这里没有列出所有的方法,关于其他方法的定义请参见源代码。

}

在这个接口之下,再定义了AbstractDataAccsee类,实现了一些公用的数据方法,在AbstractDataAccsee类之下,扩展出了各个具体的DataAccsee实现类。整个结构可以用下面的图(3.1)来表示:


3.1

为了管理这些类,并且提供可扩展性,我们需要创建一个Factory类,来实现自动数据库切换的管理。这个类很简单,主要的功能就是根据参数,判断使用什么数据库,然后,返回适当的DataAccess类。这个类的定义如下:

     public sealed class DataAccessFactory

     {

         private DataAccessFactory(){}

         private static DatabaseProperty defaultDatabaseProperty;

         public static DatabaseProperty DefaultDatabaseProperty

         {

              get{return defaultDatabaseProperty;}

              set{defaultDatabaseProperty=value;}

         }

         public static DataAccess CreateDataAccess(DatabaseProperty pp)

         {

              DataAccess dataAccess;

              switch(pp.DatabaseType)

              {

                   case(DatabaseType.MSSQLServer):

                       dataAccess = new MSSqlDataAccess(pp.ConnectionString);

                       break;

                   case(DatabaseType.Oracle):

                       dataAccess = new OracleDataAccess(pp.ConnectionString);

                       break;

                   case(DatabaseType.OleDBSupported):

                       dataAccess = new OleDbDataAccess(pp.ConnectionString);

                       break;

                   default:

                       dataAccess=new MSSqlDataAccess(pp.ConnectionString);

                       break;

              }

              return dataAccess;

         }

         public static DataAccess CreateDataAccess()

         {

              return CreateDataAccess(defaultDatabaseProperty);

         }

     }

关于DatabasePropertyDatabaseType的定义,可以参见相关源代码。

数据访问功能的调用形式如下:

DataAccess dao=DataAccessFactory.CreateDataAccess(persistenceProperty);

db.Open();

db.需要的操作

db.Close();

当数据库发生变化的时候,只需要修改相应的DatabaseProperty参数,DataAccessFactory会根据参数的不同,自动调用相应的类,客户端不会感觉到变化,也不用去关心。这样,实现了良好的封装性。当然,前提是,你在编写程序的时候,没有用到特定数据库的特性,例如,Sql Server的专用函数。

3.关于DataSetEntityData

     因为WebsharpO/R映射部分使用了DataSet,因此,在这里有必要对DataSet做一个说明。

相对于原有的ADO数据访问技术,ADO.NET 引入的主要变化之一是用 DataTableDataSetDataAdapter DataReader 对象的组合取代了 ADO Recordset 对象。DataTable 表示单个表中行的集合,在这一方面类似于 RecordsetDataSet 表示 DataTable 对象的集合,同时包括将各种表绑定在一起的关系和约束。实际上,DataSet 是带有内置 XML 支持的、内存中的关系结构。

DataSet 的主要特性之一是它不了解可能用来填充它的基础数据源。它是一个不连续的、独立的实体,用于表示数据集合,并且可以通过多层应用程序的不同层在组件之间传递。它还可以作为 XML 数据流进行序列化,这使其非常适合于在不同种类的平台之间进行数据传输。ADO.NET 使用 DataAdapter 对象将数据传送到 DataSet 和基础数据源,或者从数据源传出。DataAdapter 对象还提供以前与 Recordset 关联的增强的批量更新功能。

3.2 显示了完整的 DataSet 对象模型。

3.2

为了更方便的操纵数据,WebsharpDataSet进行了一些扩充,对于这些扩充的更详细的内容,会在后面的Websharp ORM部分做说明。