论文部分内容阅读
摘要:ADO.NET提供对Microsoft SQL Server 等数据源以及通过OLE DB和XML公开的数据源的一致访问,数据共享使用者应用程序可以使用 ADO.NET来连接到这些数据源,并检索、操作和更新数据。
关键词:ADO.NET;DataSet;XML;NET Framework;数据提供程序
中图分类号:TP311 文献标识码:A文章编号:1009-3044(2008)24-1130-03
ADO.NET Database Programming Analysis
WANG Hui, BO Tao
(Tianjin Medical School, Tianjing 300222, China)
Abstract: ADO.NET provide data source to Microsoft SQL Server and OLE DB as well as XML for the consistent access. user of date sharing can use the program of ADO.NET connecting data source and retrieval, operation and updating of the date.
Key words: ADO.NET; DataSet; XML; NET Framework; provider
1 引言
随着应用程序开发的发展演变,新的应用程序已基于 Web 应用程序模型越来越松散地耦合。如今,越来越多的应用程序使用 XML 来编码要通过网络连接传递的数据。Web应用程序将 HTTP用作在层间进行通信的结构,因此它们必须显式处理请求之间的状态维护。在此编程风格中,连接会在程序的整个生存期中保持打开,而不需要对状态进行特殊处理。
设计ADO.NET的目的是为了满足这一新编程模型的以下要求:具有断开式数据结构;能够与XML紧密集成;具有能够组合来自多个、不同数据源的数据的通用数据表示形式;以及具有为与数据库交互而优化的功能,这些要求都是.NET Framework固有的内容。
2 在创建ADO.NET时,Microsoft具有以下设计目标。
2.1 利用当前的ADO知识
ADO.NET 的设计满足了当今应用程序开发模型的多种要求。同时,该编程模型尽可能地与 ADO 保持一致,这使当今的ADO开发人员不必从头开始学习全新的数据访问技术。ADO.NET是.NET Framework 固有部分,因此对于 ADO 程序员决不是完全陌生的。
2.2 支持N层编程模式
ADO.NET为断开式n层编程环境提供了一流的支持,许多新的应用程序都是为该环境编写的。使用断开式数据集这一概念已成为编程模型中的焦点。n层编程的ADO.NET 解决方案就是DataSet。
2.3 集成XML支持
XML和数据访问是紧密联系在一起的,即XML的全部内容都是有关数据编码的,而数据访问越来越多的内容都与XML有关。.NET Framework 不仅支持Web标准,它还是完全基于Web标准生成的。
3 ADO.NET概述
ADO.NET有效地从数据操作中将数据访问分解为多个可以单独使用或一前一后使用的不连续组件。ADO.NET包含用于连接到数据库、执行命令和检索结果的.NET Framework数据提供程序。您可以直接处理检索到的结果,或将其放入ADO.NET DataSet 对象,以便与来自多个源的数据或在层之间进行远程处理的数据组合在一起,以特殊方式向用户公开。ADO.NET DataSet对象也可以独立于.NET Framework 数据提供程序使用,以管理应用程序本地的数据或源自XML的数据。
3.1 ADO.NET结构
3.1.1 XML和ADO.NET
ADO.NET借用XML的力量来提供对数据的断开式访问。ADO.NET的设计与.NET Framework中XML类的设计是并进的,它们都是同一个结构的组件。
ADO.NET和.NET Framework中的XML类集中于DataSet对象。无论DataSet是文件还是XML流,它都可以使用来自 XML 源的数据来进行填充。
3.1.2 ADO.NET组件
设计 ADO.NET组件的目的是为了从数据操作中分解出数据访问。ADO.NET的两个核心组件会完成此任务:DataSet和.NET Framework数据提供程序,后者是一组包括 Connection、Command、DataReader 和 DataAdapter 对象在内的组件。
ADO.NET DataSet是 ADO.NET 的断开式结构的核心组件。DataSet 的设计目的很明确:为了实现独立于任何数据源的数据访问。因此,它可以用于多种不同的数据源,用于 XML 数据,或用于管理应用程序本地的数据。
ADO.NET 结构的另一个核心元素是 NET Framework数据提供程序 ,其组件的设计目的相当明确:为了实现数据操作和对数据的快速、只进、只读访问。Connection 对象提供与数据源的连接。Command 对象使您能够访问用于返回数据、修改数据、运行存储过程以及发送或检索参数信息的数据库命令。DataReader 从数据源中提供高性能的数据流。最后,DataAdapter 提供连接 DataSet 对象和数据源的桥梁。DataAdapter 使用 Command 对象在数据源中执行 SQL 命令,以便将数据加载到 DataSet 中,并使对 DataSet 中数据的更改与数据源保持一致。
下图阐释了 ADO.NET 结构的组件:
4 使用ADO.NET
4.1 使用 ADO.NET连接到SQL Server
Dim nwindConn As SqlConnection = New SqlConnection("Data Source=localhost;Integrated Security=SSPI; Initial Catalog=northwind")
nwindConn.Open()
4.2 执行命令
当建立与数据源的连接后,可以使用 Command 对象来执行命令并从数据源中返回结果。您可以使用 Command 构造函数来创建命令,该构造函数采用在数据源、Connection 对象和 Transaction 对象中执行的 SQL 语句的可选参数。也可以使用 Connection 的 CreateCommand 方法来创建用于特定 Connection 对象的命令。您可以使用 CommandText 属性来查询和修改 Command 对象的 SQL 语句。
Command 对象公开了几个可用于执行所需操作的 Execute 方法。当以数据流的形式返回结果时,使用 ExecuteReader 可返回 DataReader 对象。使用 ExecuteScalar 可返回单个值。使用 ExecuteNonQuery 可执行不返回行的命令。
以下代码示例演示如何设置 Command 对象的格式,以便从 Northwind 数据库中返回 Categories 的列表。
Dim catCMD As SqlCommand = New SqlCommand("SELECT CategoryID, CategoryName FROM Categories", nwindConn)[1]
4.3 使用 DataReader 检索数据
可以使用 ADO.NET DataReader 从数据库中检索只读、只进的数据流。查询结果在查询执行时返回,在并存储在客户端的网络缓冲区中,直到您使用 DataReader 的 Read 方法对它们发出请求。使用 DataReader 可以提高应用程序的性能,因为一旦数据可用,DataReader 方法就立即检索该数据,而不是等待返回查询的全部结果;并且在默认情况下,该方法一次只在内存中存储一行,从而降低了系统开销。
当创建 Command 对象的实例后,可调用 Command.ExecuteReader 从数据源中检索行,从而创建一个 DataReader,如以下示例所示。
Dim myReader As SqlDataReader = myCommand.ExecuteReader()
4.4 从 SQL Server 中以 XML 形式获取数据
Microsoft SQL Server 2000 引入了在检索数据时对 XML 功能的支持。为了使您能够直接从 Microsoft SQL Server 2000 中返回 XML 流,SQL Server .NET Framework 数据提供程序的 SqlCommand 对象具有 ExecuteXmlReader 方法。ExecuteXmlReader 返回已填充了为 SqlCommand 指定的 SQL 语句的结果的 System.Xml.XmlReader 对象。
Dim custCMD As SqlCommand = New SqlCommand("SELECT * FROM Customers FOR XML AUTO, ELEMENTS", nwindConn)
Dim myXR As System.Xml.XmlReader = custCMD.ExecuteXmlReader()[2]
4.5 从 DataAdapter 填充 DataSet
ADO.NET DataSet 是数据的内存驻留表示形式,它提供了独立于数据源的一致关系编程模型。DataSet 表示整个数据集,其中包含表、约束和表之间的关系。由于 DataSet 独立于数据源,DataSet 可以包含应用程序本地的数据,也可以包含来自多个数据源的数据。与现有数据源的交互通过 DataAdapter 来控制。
.NET Framework 所包含的每个NET Framework 数据提供程序都具有一个DataAdapter对象,DataAdapter对象用于从数据源中检索数据并填充DataSet中的表,DataAdapter还会将对DataSet作出的更改解析回数据源。DataAdapter使用 .NET Framework 数据提供程序的Connection对象连接到数据源,使用Command对象从数据源中检索数据并将更改解析回数据源。
DataAdapter的SelectCommand属性是一个Command对象,它从数据源中检索数据。DataAdapter 的 InsertCommand、UpdateCommand和DeleteCommand 属性也是 Command 对象,它们按照对DataSet 中数据的修改来管理对数据源中数据的更新。DataAdapter 的 Fill 方法用于使用 DataAdapter 的 SelectCommand 的结果来填充 DataSet。Fill 将要填充的 DataSet 和 DataTable 对象(或要使用从 SelectCommand 中返回的行来填充的 DataTable 的名称)用作它的参数。
Fill 方法使用 DataReader 对象来隐式地返回用于在 DataSet 中创建表的列名称和类型以及用来填充 DataSet 中的表行的数据。表和列仅在不存在时才创建;否则,Fill 将使用现有的 DataSet 架构。
4.6 使用 DataAdapter 和 DataSet 更新数据库
DataAdapter 的 Update 方法可调用来将 DataSet 中的更改解析回数据源。与 Fill 方法类似,Update 方法将 DataSet 的实例和可选的 DataTable 对象或 DataTable 名称用作参数。DataSet 实例是包含已作出的更改的 DataSet,而 DataTable 标识从其中检索更改的表。
当调用 Update 方法时,DataAdapter 将分析已作出的更改并执行相应的命令(INSERT、UPDATE 或 DELETE)。当 DataAdapter 遇到对 DataRow 的更改时,它将使用 InsertCommand、UpdateCommand 或 DeleteCommand 来处理该更改。这样,您就可以通过在设计时指定命令语法并在可能时通过使用存储过程来尽量提高 ADO.NET 应用程序的性能。在调用 Update 之前,必须显式设置这些命令。如果调用了 Update 但不存在用于特定更新的相应命令(例如,不存在用于已删除行的 DeleteCommand),则将引发异常。
Command 参数可用于为 DataSet 中每个已修改行的 SQL 语句或存储过程指定输入和输出值。
5 ADO.NET 示例程序
以下示例连接到 Microsoft SQL Server 2000 上的 Northwind 数据库,并使用 DataReader返回一个类别列表。
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports Microsoft.VisualBasic
Public Class Sample
Public Shared Sub Main()
Dim nwindConn As SqlConnection = New SqlConnection("Data Source=localhost; Integrated Security=SSPI;Initial Catalog=northwind")
Dim catCMD As SqlCommand = nwindConn.CreateCommand()
catCMD.CommandText = "SELECT CategoryID, CategoryName FROM Categories"
nwindConn.Open()
Dim myReader As SqlDataReader = catCMD.ExecuteReader()
Do While myReader.Read()
Console.WriteLine(vbTab
关键词:ADO.NET;DataSet;XML;NET Framework;数据提供程序
中图分类号:TP311 文献标识码:A文章编号:1009-3044(2008)24-1130-03
ADO.NET Database Programming Analysis
WANG Hui, BO Tao
(Tianjin Medical School, Tianjing 300222, China)
Abstract: ADO.NET provide data source to Microsoft SQL Server and OLE DB as well as XML for the consistent access. user of date sharing can use the program of ADO.NET connecting data source and retrieval, operation and updating of the date.
Key words: ADO.NET; DataSet; XML; NET Framework; provider
1 引言
随着应用程序开发的发展演变,新的应用程序已基于 Web 应用程序模型越来越松散地耦合。如今,越来越多的应用程序使用 XML 来编码要通过网络连接传递的数据。Web应用程序将 HTTP用作在层间进行通信的结构,因此它们必须显式处理请求之间的状态维护。在此编程风格中,连接会在程序的整个生存期中保持打开,而不需要对状态进行特殊处理。
设计ADO.NET的目的是为了满足这一新编程模型的以下要求:具有断开式数据结构;能够与XML紧密集成;具有能够组合来自多个、不同数据源的数据的通用数据表示形式;以及具有为与数据库交互而优化的功能,这些要求都是.NET Framework固有的内容。
2 在创建ADO.NET时,Microsoft具有以下设计目标。
2.1 利用当前的ADO知识
ADO.NET 的设计满足了当今应用程序开发模型的多种要求。同时,该编程模型尽可能地与 ADO 保持一致,这使当今的ADO开发人员不必从头开始学习全新的数据访问技术。ADO.NET是.NET Framework 固有部分,因此对于 ADO 程序员决不是完全陌生的。
2.2 支持N层编程模式
ADO.NET为断开式n层编程环境提供了一流的支持,许多新的应用程序都是为该环境编写的。使用断开式数据集这一概念已成为编程模型中的焦点。n层编程的ADO.NET 解决方案就是DataSet。
2.3 集成XML支持
XML和数据访问是紧密联系在一起的,即XML的全部内容都是有关数据编码的,而数据访问越来越多的内容都与XML有关。.NET Framework 不仅支持Web标准,它还是完全基于Web标准生成的。
3 ADO.NET概述
ADO.NET有效地从数据操作中将数据访问分解为多个可以单独使用或一前一后使用的不连续组件。ADO.NET包含用于连接到数据库、执行命令和检索结果的.NET Framework数据提供程序。您可以直接处理检索到的结果,或将其放入ADO.NET DataSet 对象,以便与来自多个源的数据或在层之间进行远程处理的数据组合在一起,以特殊方式向用户公开。ADO.NET DataSet对象也可以独立于.NET Framework 数据提供程序使用,以管理应用程序本地的数据或源自XML的数据。
3.1 ADO.NET结构
3.1.1 XML和ADO.NET
ADO.NET借用XML的力量来提供对数据的断开式访问。ADO.NET的设计与.NET Framework中XML类的设计是并进的,它们都是同一个结构的组件。
ADO.NET和.NET Framework中的XML类集中于DataSet对象。无论DataSet是文件还是XML流,它都可以使用来自 XML 源的数据来进行填充。
3.1.2 ADO.NET组件
设计 ADO.NET组件的目的是为了从数据操作中分解出数据访问。ADO.NET的两个核心组件会完成此任务:DataSet和.NET Framework数据提供程序,后者是一组包括 Connection、Command、DataReader 和 DataAdapter 对象在内的组件。
ADO.NET DataSet是 ADO.NET 的断开式结构的核心组件。DataSet 的设计目的很明确:为了实现独立于任何数据源的数据访问。因此,它可以用于多种不同的数据源,用于 XML 数据,或用于管理应用程序本地的数据。
ADO.NET 结构的另一个核心元素是 NET Framework数据提供程序 ,其组件的设计目的相当明确:为了实现数据操作和对数据的快速、只进、只读访问。Connection 对象提供与数据源的连接。Command 对象使您能够访问用于返回数据、修改数据、运行存储过程以及发送或检索参数信息的数据库命令。DataReader 从数据源中提供高性能的数据流。最后,DataAdapter 提供连接 DataSet 对象和数据源的桥梁。DataAdapter 使用 Command 对象在数据源中执行 SQL 命令,以便将数据加载到 DataSet 中,并使对 DataSet 中数据的更改与数据源保持一致。
下图阐释了 ADO.NET 结构的组件:
4 使用ADO.NET
4.1 使用 ADO.NET连接到SQL Server
Dim nwindConn As SqlConnection = New SqlConnection("Data Source=localhost;Integrated Security=SSPI; Initial Catalog=northwind")
nwindConn.Open()
4.2 执行命令
当建立与数据源的连接后,可以使用 Command 对象来执行命令并从数据源中返回结果。您可以使用 Command 构造函数来创建命令,该构造函数采用在数据源、Connection 对象和 Transaction 对象中执行的 SQL 语句的可选参数。也可以使用 Connection 的 CreateCommand 方法来创建用于特定 Connection 对象的命令。您可以使用 CommandText 属性来查询和修改 Command 对象的 SQL 语句。
Command 对象公开了几个可用于执行所需操作的 Execute 方法。当以数据流的形式返回结果时,使用 ExecuteReader 可返回 DataReader 对象。使用 ExecuteScalar 可返回单个值。使用 ExecuteNonQuery 可执行不返回行的命令。
以下代码示例演示如何设置 Command 对象的格式,以便从 Northwind 数据库中返回 Categories 的列表。
Dim catCMD As SqlCommand = New SqlCommand("SELECT CategoryID, CategoryName FROM Categories", nwindConn)[1]
4.3 使用 DataReader 检索数据
可以使用 ADO.NET DataReader 从数据库中检索只读、只进的数据流。查询结果在查询执行时返回,在并存储在客户端的网络缓冲区中,直到您使用 DataReader 的 Read 方法对它们发出请求。使用 DataReader 可以提高应用程序的性能,因为一旦数据可用,DataReader 方法就立即检索该数据,而不是等待返回查询的全部结果;并且在默认情况下,该方法一次只在内存中存储一行,从而降低了系统开销。
当创建 Command 对象的实例后,可调用 Command.ExecuteReader 从数据源中检索行,从而创建一个 DataReader,如以下示例所示。
Dim myReader As SqlDataReader = myCommand.ExecuteReader()
4.4 从 SQL Server 中以 XML 形式获取数据
Microsoft SQL Server 2000 引入了在检索数据时对 XML 功能的支持。为了使您能够直接从 Microsoft SQL Server 2000 中返回 XML 流,SQL Server .NET Framework 数据提供程序的 SqlCommand 对象具有 ExecuteXmlReader 方法。ExecuteXmlReader 返回已填充了为 SqlCommand 指定的 SQL 语句的结果的 System.Xml.XmlReader 对象。
Dim custCMD As SqlCommand = New SqlCommand("SELECT * FROM Customers FOR XML AUTO, ELEMENTS", nwindConn)
Dim myXR As System.Xml.XmlReader = custCMD.ExecuteXmlReader()[2]
4.5 从 DataAdapter 填充 DataSet
ADO.NET DataSet 是数据的内存驻留表示形式,它提供了独立于数据源的一致关系编程模型。DataSet 表示整个数据集,其中包含表、约束和表之间的关系。由于 DataSet 独立于数据源,DataSet 可以包含应用程序本地的数据,也可以包含来自多个数据源的数据。与现有数据源的交互通过 DataAdapter 来控制。
.NET Framework 所包含的每个NET Framework 数据提供程序都具有一个DataAdapter对象,DataAdapter对象用于从数据源中检索数据并填充DataSet中的表,DataAdapter还会将对DataSet作出的更改解析回数据源。DataAdapter使用 .NET Framework 数据提供程序的Connection对象连接到数据源,使用Command对象从数据源中检索数据并将更改解析回数据源。
DataAdapter的SelectCommand属性是一个Command对象,它从数据源中检索数据。DataAdapter 的 InsertCommand、UpdateCommand和DeleteCommand 属性也是 Command 对象,它们按照对DataSet 中数据的修改来管理对数据源中数据的更新。DataAdapter 的 Fill 方法用于使用 DataAdapter 的 SelectCommand 的结果来填充 DataSet。Fill 将要填充的 DataSet 和 DataTable 对象(或要使用从 SelectCommand 中返回的行来填充的 DataTable 的名称)用作它的参数。
Fill 方法使用 DataReader 对象来隐式地返回用于在 DataSet 中创建表的列名称和类型以及用来填充 DataSet 中的表行的数据。表和列仅在不存在时才创建;否则,Fill 将使用现有的 DataSet 架构。
4.6 使用 DataAdapter 和 DataSet 更新数据库
DataAdapter 的 Update 方法可调用来将 DataSet 中的更改解析回数据源。与 Fill 方法类似,Update 方法将 DataSet 的实例和可选的 DataTable 对象或 DataTable 名称用作参数。DataSet 实例是包含已作出的更改的 DataSet,而 DataTable 标识从其中检索更改的表。
当调用 Update 方法时,DataAdapter 将分析已作出的更改并执行相应的命令(INSERT、UPDATE 或 DELETE)。当 DataAdapter 遇到对 DataRow 的更改时,它将使用 InsertCommand、UpdateCommand 或 DeleteCommand 来处理该更改。这样,您就可以通过在设计时指定命令语法并在可能时通过使用存储过程来尽量提高 ADO.NET 应用程序的性能。在调用 Update 之前,必须显式设置这些命令。如果调用了 Update 但不存在用于特定更新的相应命令(例如,不存在用于已删除行的 DeleteCommand),则将引发异常。
Command 参数可用于为 DataSet 中每个已修改行的 SQL 语句或存储过程指定输入和输出值。
5 ADO.NET 示例程序
以下示例连接到 Microsoft SQL Server 2000 上的 Northwind 数据库,并使用 DataReader返回一个类别列表。
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports Microsoft.VisualBasic
Public Class Sample
Public Shared Sub Main()
Dim nwindConn As SqlConnection = New SqlConnection("Data Source=localhost; Integrated Security=SSPI;Initial Catalog=northwind")
Dim catCMD As SqlCommand = nwindConn.CreateCommand()
catCMD.CommandText = "SELECT CategoryID, CategoryName FROM Categories"
nwindConn.Open()
Dim myReader As SqlDataReader = catCMD.ExecuteReader()
Do While myReader.Read()
Console.WriteLine(vbTab