Ctamor

个体和迭代,超越过程和工具;工作的软件,超越完整的文档;客户协作,超越合同谈判;响应变更,超越履行计划;

导航

Websharp的数据库访问层

Posted on 2006-12-03 16:06  Ctamor (四川理工)  阅读(316)  评论(0编辑  收藏  举报

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部分做说明。
来源:http://www.websharp.org/