回头再学Asp.net系列--基础篇,四

.Net的数据库访问技术

在windows系统下的数据库访问技术主要有:ODBC(开放数据库连接),DAO(数据访问对象),RDO(远程数据对象),JDBC(java数据库连接),OLE DB(对象链接嵌入数据库),ADO(ActiveX数据对象),随着微软.net框架的推出,基于.net平台的数据库访问技术也在原来ado的基础上做出了重大的改进,升级到了全新的ado.net数据库访问技术,ado.net也是.net平台上最重要的数据库访问技术。

使用 DAO 和 MFC DAO 类,可以访问下列数据源:

1.用数据库引擎版本为 1.x、2.x 和 3.0 的 Microsoft Access 或 Microsoft Visual Basic 创建的、使用 Microsoft Jet 数据库引擎的数据库。

2.可安装的 ISAM 数据库,包括: dBASE III、dBASE IV 和 dBASE 5.0;Paradox 3.x、4.x 和 5.x 版

3.开放式数据库连接 (ODBC) 数据库,包括但不仅限于 Microsoft SQL Server、SYBASE SQL Server 和 ORACLE Server。若要访问 ODBC 数据库,必须具有希望访问的数据库的适当 ODBC 驱动程序。有关 Visual C++ 此版本中包括的 ODBC 驱动程序列表以及有关获取其他驱动程序的信息,请参见 ODBC 驱动程序列表。

4.Microsoft Excel 3.0、4.0、5.0 和 7.0 版工作表。

5.Lotus WKS、WK1、WK3 和 WK4 电子表格。

6.文本文件。

OLE DB 是用于访问数据的基于 COM 的应用程序编程接口 (API)。OLE DB 支持访问以 OLE DB 提供程序可以使用的任何格式(数据库、电子表格、文本文件等)存储的数据。每个 OLE DB 提供程序从某一特定类型的数据源(例如 SQL Server 数据库、Microsoft Access 数据库或 Microsoft Excel 电子表格)公开数据。

OLE DB对ODBC的兼容性,允许OLE DB访问现有的ODBC数据源。其优点很明显,由于ODBC相对OLE DB来说使用得更为普遍,因此可以获得的ODBC驱动程序相应地要比OLE DB的要多。这样不一定要得到OLE DB的驱动程序,就可以立即访问原有的数据系统。

提供者位于OLE DB层,而驱动程序位于ODBC层。

ADO.NET是微软.NET框架的一部分,它由一组工具和层组成,应用程序可以借此与基于文件或基于服务器的数据存储很轻松地进行通信和管理。在.NET框架中,ADO.NET类库位于System.Data命名空间下。这些类库包括连接到数据源、执行命令以及在存储、操作和获取数据等功能。对于不同的应用需要,ADO.NET设计了两种访问数据库的模式:使用DataReader对象进行基于连接的访问和使用DataAdapter对象进行的非连接的访问。ADO.NET与以前的数据访问技术相比的不同之处,就是它可以让应用程序与数据库以完全非连接的数据缓存的方式来交互以实现离线操作数据。过去使用诸如远程数据对象(RDO)来实现这样的功能,但是那只是在已有的技术上做一些修正。而ADO.NET则是基于这样的需求从头开始搭建的。

Connection对象提供与数据源的连接;Command对象用于返回数据、修改数据、运行存储过程以及发送或检索参数信息的数据库命令;DataReader从数据源中得到高性能的数据流; DataAdapter是连接DataSet对象和数据源的桥梁。

DataReader和DataSet之间的主要区别是前者的内存开销要比后者更小,当不需要在缓冲区中进行数据修改等操作,也不需要索引随机访问数据记录时,DataReader是一个更好的选择,它能提高程序的性能。DataReader是一个一次只能让你访问单行记录信息的对象,其含义是,不管结果集的大小,用DataReader来回移动该结果集时,一次只有单行记录加载到内存中;另一方面,DataSet是专门为内存缓存大量数据而设计的。

DataReader和DataSet两种类都支持多个结果集的概念,但实现方式不同,DataReader通过NextResult方法来支持访问多个结果集,而DataSet将多个结果集加载到其中不同的DataTable对象中。

接池(Connection Pool)是连接对象的集合体,实际上是指拥有一定数量的连接对象的“缓冲存储池”。连接池内部提供一种管理机制,能控制连接池内部边接对象的个数、使用次数和时间,对应用程序提供获取和释放连接的接口。

在需要高度并发/高度可用应用程序中,大部分时间里用户可能会保持一个打开的连接,而且不是积极地使用该连接,因为用户在使用应用程序的其他功能,意识到这一点很重要。应用程序可以把其宝贵的资源――一个打开的连接――从本质上切割成时间片断,并且在多个用户之间来池化它。连接池在池中提供一些连接对象,对同一个数据源连接的不同请求可以用同一个连接对象来处理,这样就避免了重新建立一个连接的操作。

建立连接池能显著地提高应用程序的性能和可伸缩性。连接池是根据每个唯一的连接字符串创建的,当创建一个池后,将按最小池大小的要求创建多个连接对象并将其添加到该池中。在请求连接时,将根据需要添加到池中,直至达到连接池上限。当达到上限且没有可用的连接,则该请求将会被排入等待队列。当连接被释放回池中时,连接池管理程序通过重新分配连接来满足这些请求[12]。

当请求SqlConnection对象时,如果存在可用的连接,则将从池中获取该对象。若要成为可用连接,该连接当前必须未被使用,具有匹配的事务上下文或者不与任何事务上下文相关联,并且具有与服务器的有效连接。使用ADO.NET的连接池实际上是很简单的,因为你并不需要做什么而仅用默认设置就能使用连接池;相反,如果你不想使用连接池,则需要显式地关闭它。

关闭连接:良好的应用程序设计

连接对象必须实现IDisposable接口。通常,IDisposable.Dispose方法是任何对象用于清除工作的方法,当不再需要对象时,对象的使用者可以调用此方法垃圾回收器会自动释放分配给该对象的内存[14]。程序员在看到这个方法时都应知道去调用它,而在C#和VB.NET 存在诸如using代码块这样的结构,能自动调用Dispose方法。

ADO.NET连接对象完全遵循这样的规则:它使用Dispose方法清空所有未分配的资源。除了清空未分配的资源外,Dispose方法还调用连接对象的close,使得连接可以在连接池准备被重用。除了调用close外,Dispose只比Close方法多干了一点事情:Dispose清除了内部集合从而清空了各种设置――诸如连接对象上的连接串,因此它可以让垃圾收集器重用那些被具体连接对象所占用的内存;但是,单独调用Close方法能使实际的底层对象在连接池中变为可重用。调用连接对象的Dispose方法可以让我们不用再地调用连接的Close方法。它不仅确保了底层连接被池化,而且也确保了所分配的资源被垃圾收集;