|  
                    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部分做说明。 |