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
提供程序)通常能够提供性能方面的改善,部分原因在于少了一个抽象层。
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。
在各自的关联命名空间内,每个提供程序都提供了对
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(){}
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);
}
} |
关于DatabaseProperty和DatabaseType的定义,可以参见相关源代码。
数据访问功能的调用形式如下:
DataAccess dao=DataAccessFactory.CreateDataAccess(persistenceProperty);
db.Open();
db.需要的操作
db.Close(); |
当数据库发生变化的时候,只需要修改相应的DatabaseProperty参数,DataAccessFactory会根据参数的不同,自动调用相应的类,客户端不会感觉到变化,也不用去关心。这样,实现了良好的封装性。当然,前提是,你在编写程序的时候,没有用到特定数据库的特性,例如,Sql
Server的专用函数。
3.关于DataSet和EntityData
因为Websharp的O/R映射部分使用了DataSet,因此,在这里有必要对DataSet做一个说明。
相对于原有的ADO数据访问技术,ADO.NET
引入的主要变化之一是用
DataTable、DataSet、DataAdapter
和
DataReader
对象的组合取代了
ADO Recordset 对象。DataTable
表示单个表中行的集合,在这一方面类似于
Recordset。DataSet
表示
DataTable
对象的集合,同时包括将各种表绑定在一起的关系和约束。实际上,DataSet
是带有内置
XML 支持的、内存中的关系结构。
DataSet
的主要特性之一是它不了解可能用来填充它的基础数据源。它是一个不连续的、独立的实体,用于表示数据集合,并且可以通过多层应用程序的不同层在组件之间传递。它还可以作为
XML
数据流进行序列化,这使其非常适合于在不同种类的平台之间进行数据传输。ADO.NET
使用
DataAdapter
对象将数据传送到
DataSet
和基础数据源,或者从数据源传出。DataAdapter
对象还提供以前与
Recordset
关联的增强的批量更新功能。
图3.2
显示了完整的
DataSet
对象模型。
图
3.2
为了更方便的操纵数据,Websharp对DataSet进行了一些扩充,对于这些扩充的更详细的内容,会在后面的Websharp
ORM部分做说明。 |