当前市场上存在着数十种不同类型的数据库,这些数据库分别由不同的公司开发,采用的数据格式和接口也各不相同,因此当应用程序访问它们时,就需要分别编写不同的接口,这给应用程序的设计带来了麻烦。解决这个问题的方法就是由系统提供各种不同数据库的驱动程序,然后放在应用程序与数据库之间作为中间环节。
微软公司提供的通用接口,多年来已经经历了几次大的改进。ActiveX Data Objects(ADO)是Microsoft开发的面向对象的数据访问库,目前已经得到了广泛的应用,而ADO.NET则是ADO的后续技术。但ADO.NET并不是ADO的简单升级,而是采用了一种全新的技术。利用ADO.NET,程序员可以非常简单而快速地访问数据库,主要表现在以下几个方面:
√ ADO.NET不是采用ActiveX技术,而是与.NET框架紧密结合的产物。
√ ADO.NET包含对XML标准的完全支持,对跨平台交换数据具有十分重要的意义。
√ ADO.NET既能在与数据源链接的环境下工作,又能在断开与数据源链接的条件下工作,非常适合于网络应用的需要。
ADO.NET访问数据采用层次结构,其逻辑关系如图5-6所示。
图5-6 ADO.NET层次结构
ADO.NET的设计目的是从数据操作中分解出数据访问。ADO.NET有两个核心组件完成此任务:DataSet和.NET Framework数据提供程序。
在网络环境下,保持与数据源链接,如果不符合网站的要求,不仅效率低,付出的代价高,而且常常会引发由于多个用户同时访问时带来的冲突。ADO.NET系统集中主要精力用于解决在断开与数据源链接的条件下数据处理的问题。ADO.NET DataSet是ADO.NET的断开式结构的核心组件,它的设计目的很明确,是为了实现独立于任何数据源的数据访问。因此,它可以用于多种不同的数据源,用于XML数据,或用于管理应用程序本地的数据。DataSet包含一个或多个DataTable对象的集合,这些对象由数据行和数据列以及主键、外键、约束和有关DataTable对象中数据的关系信息组成。
ADO.NET结构的另一个核心元素是.NETFramework数据提供程序,它相当于ADO.NET的通用接口,用于建立数据源与数据集之间的联系,不同的数据提供器对应于不同类型的数据源。它能按要求将数据源中的数据提供给数据集,或者从数据集向数据源返回编辑后的数据。它包括4种核心类:
● Connection:用于建立与数据源的链接。该类中包括链接方法,以及描述当前链接状态的属性。其最重要的属性是ConnectionString,用于指定服务器名称、数据源信息以及其他登录信息。
● Command:用于设置适合于数据源的操作命令,以便执行检索、编辑或输出参数等数据操作。对于数据库来说,这些命令既可以是内联的SQL语句,也可以是数据库的存储过程。由Command类生成的对象只能在链接的基础上,对链接的数据源指定相应的操作。
● DataReader:从数据源中读取只进且只读的数据流。DataReader只能在与数据源保持链接的状态下工作,首先打开与数据源的链接,然后调用DataReader类的Reader()方法,关闭与数据源的链接。
● DataAdapter:每张表对应一个数据适配器,用来向数据集中填入数据(调用Fill()方法),或者从数据集中读出数据。
DataAdapter提供链接DataSet对象和数据源的桥梁,向数据集中填入数据,或者从数据集中读出数据。当DataAdapter对象调用Fill()方法时,使用Command对象在数据源中执行SQL命令,以便将数据加载到DataSet中,并使对DataSet中数据的更改与数据源保持一致。当执行上述SQL语句时,与数据库的链接必须有效,但不需要用语句将链接对象打开。如果调用Fill()方法之前与数据库的链接已经关闭,则将自动打开它以检索数据。执行完毕后再自动将其关闭。如果调用Fill()方法之前链接对象已经打开,则检索后继续保持打开状态。
目前,.NET Framework附带了两个数据提供程序:SQL Server.NET Framework数据提供程序和OLE DB.NET Framework数据提供程序。为了使应用程序获得最佳性能,应该使用适合数据源的.NET数据提供程序。表5-2给出了两种数据提供程序的适用情况。
表5-2 .NET数据提供程序适用情况
举例来说,如果要访问SQL Server 2008数据库,应该使用SQL Server.NET数据提供程序;而如果是要访问Access数据库,则应该使用OLE DB.NET数据提供程序。
综上所述,ADO.NET提供对Microsoft SQL Server等数据源以及通过OLE DB和XML公开的数据源的一致访问。可以直接处理检索到的结果,或将其放入ADO.NET DataSet对象,以便与来自多个源的数据或在层之间进行远程处理的数据组合在一起,以特殊方式公开。ADO.NET的DataSet对象也可以独立于.NET Framework数据提供程序使用,以管理应用程序本地的数据或源自XML的数据。ADO.NET组件的结构模型如图5-7所示。
图5-7 ADO.NET组件结构模型(www.daowen.com)
从上面的分析中可以看出,通过ADO.NET访问数据库的一般步骤如下:
(1)建立数据库链接对象(Connection对象)。
(2)打开数据库链接(Connection对象的Open方法)。
(3)建立数据库命令对象,指定命令对象所使用的链接对象(Command对象)。
(4)指定命令对象的命令属性(Command对象的CommandText属性)。
(5)执行命令(Command对象的方法,例如ExecuteReader方法)。
(6)操作返回结果(SqlDataReader对象或者其他对象)。
(7)关闭数据库链接。
例如:首先定义一个字符串型的connStr变量,用来存储链接SQLServer的数据库链接字符串。接着新建一个SqlConnection对象,用于链接数据库:
调用conn对象的Open方法打开数据库链接:
新建SqlCommand对象,该对象用于向数据库发出命令。通常可以通过调用数据库链接对象conn的CreateCommand方法来建立SqlCommand对象,事实上SqlCommand对象有自己的构造函数。
有了命令对象cmd以后,通过如下代码指定该命令对象的命令属性CommandText:
到目前为止,命令对象cmd已经设置完毕,可以向数据库发出命令,执行CommandText中所定义的操作了。为了保存cmd对象的执行结果,声明一个SqlData Reader对象reader,并将cmd的执行结果保存在reader中:
接着定义变量output,用于保存要输出的内容。目前reader中已经保存了从数据库中读取的信息,现在的任务是输出它们。从数据阅读器中获取数据一般用while循环,数据读取器的Read方法一直返回真值,直到reader的指针指向最后一条记录的后面。读取数据并显示的代码如下:
数据被读取以后应该立刻关闭数据读取器和数据库链接对象:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。