ADO.NET是对Microsoft ActiveX Data Objects (ADO)一个跨时代的改进,它提供了平台互用性和可伸缩的数据访问。由于传送的数据都是XML格式的,因此任何能够读取XML格式的应用程序都可以进行数据处理。事实上,接受数据的组件不一定要是ADO .NET组件,它可以是基于一个Microsoft Visual Studio的解决方案,也可以是任何运行在其它平台上的任何应用程序。
以前做数据库访问的时候,需要一直与数据库保持连接,直到获取完所有满足需要的数据之后才会断开数据库连接,这种数据库访问方式称之为连接式数据访问技术。相比于以前的连接式数据访问技术,ADO.NET除了提供连接式数据访问技术之外,还提供了另一种断开式解决方案,那就是在内存中模拟一个数据库,也就是内存中的数据库。
我们知道在实际的数据库技术中,每个数据库就是一个业务逻辑单元,一般来说这个数据库包含了实现一个应用软件或者一个网站所需要的全部数据。在这里数据库就是顶级对象,我们引用创建数据库时所用到的名词database来表示(因为创建数据库的SQL语句是create database),在一个数据库里可以包含有多个表(table)和视图(view),除此之外还可以包含有一些外键关系等。在一个表(table)或者视图(view)里可以包含多个列(column)和行(row)。
在ADO.NET中对上面提到的对象都在内存中进行了模拟,在内存中的数据库对象称之为DataSet,一个内存中的数据库(DataSet)可以包含多个在内存中的表(DataTable)和内存中的视图(DataView),并且也允许在表存在一些关系(DataRelation)。同时在一个内存中的表(DataTable)或者内存中的视图(DataView)中也允许存在行(DataRow)和列(DataColumn)。
物理数据库与内存数据库之间的各对象的对应关系如下:
在上图中颜色相同的表示二者基本上是一种对应关系。
将讲述6个ADO.NET中的常用对象:
Connection对象
Command对象
DataReader对象
DataAdapter对象
DataSet对象
DataTable对象
DataRow对象
DataColumn对象
参数化SQL语句
分页查询SQL语句
严格地说,在.net类库中并没有Connection、Command、DataAdapter和DataReader对象的,这是对相关的对象做了一个抽象。在实际的开发中,我们经常用到的数据库有Access、SQL Server、Oracle、MySQL等,尽管大部分都遵循SQL国际化标准,但是它们在遵循标准的前提下又做了一些扩充,并且即使遵循了相同的标准,但是实现方法并不相同,所以在某些情况下实现相同的功能可能在不同的数据库中SQL语句并不相同。
于是,在ADO.NET也定义了一套用于访问数据库的标准,当然这个标准是以接口(interface)的形式提供的,各数据库厂商只要实现了这个接口就能在ADO.NET下正常工作(这也是接口的作用,接口就是用于指定规范,自己本身并不实现,在Java中针对数据库访问也有一套接口留待各数据库来实现)。当然在.net类库中微软已经提供对Access、SQL Server和Oracle数据库对上面提到的接口的实现。
在ADO.NET中定义的这一套接口是IDbConnection、IDbCommand、IDbDataAdapter和IDataReader,并且还有一套实现这些接口的抽象类,分别是DbConnection、DbCommand、DbDataAdapter和DataReader。
上图最上面的是数据库访问接口,紧接着的是数据库访问抽象类,下面是针对不同数据库中实现这些接口的类,并且在括号中注明了其所在的命名空间,比如针对MySQL数据的数据库访问类就位于MySql.Data.MySqlClient命名空间下,关于MySql的数据库访问类需要到MySql数据库的官方网站去下载。其它的数据库访问类都在.net类库中自带了。
注意:访问SQL Server7.0以下版本的SQL Server数据库时需要用System.Data.OleDb命名空间下一套数据库访问类,虽然这一套数据库访问类同样也能访问SQL Server2000以上版本,但是没有办法利用SQL Server数据库的一些新特性,所以不建议使用System.Data.OleDb命名空间下的类访问SQL Server2000以上的版本。
在本篇的讲述中,针对SQL Server数据库讲述Connection、Command、DataAdapter和DataReader对象的用法,它们在其它数据库中也有对应的类,除了有些SQL语句语法不一样之外,用法是基本一样的。