第三章 Websharp的数据库访问层

第三章Websharp的数据库访问层

1.数据库访问

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

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

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

? SQL Server .NET 数据提供程序。这是一个用于 Microsoft SQL

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

通过 Oracle 客户端连接软件支持对 Oracle 数据源的数据访问。该数据提供程序支持 Oracle 客户端软件版本 8.1.7 及更高版本。 ? OLE DB .NET 数据提供程序。这是一个用于 OLE DB 数据源的托管

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

使用本机 ODBC 驱动程序管理器 (DM) 来支持借助于 COM 互操作性进行的数据访问。 还有其他一些目前正处于测试阶段的 .NET 数据提供程序。

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

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

? System.Data.OleDb:包含 OLE DB .NET 数据提供程序类型。 ? System.Data.Odbc:包含 ODBC .NET 数据提供程序类型。 ? System.Data:包含独立于提供程序的类型,如 DataSet 和

DataTable。

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

DataAdapter 对象的两个实现分别为 SqlDataAdapter 和 OleDbDataAdapter。

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

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

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4