使用ADO.NET访问数据库

原创 2002年04月15日 09:10:00

ADO.NET 概述<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

ADO.NET 提供对 Microsoft SQL Server 等数据源以及通过 OLE DB XML 公开的数据源的一致访问。数据共享使用者应用程序可以使用 ADO.NET 来连接到这些数据源,并检索、操作和更新数据。

ADO.NET 有效地从数据操作中将数据访问分解为多个可以单独使用或一前一后使用的不连续组件。ADO.NET 包含用于连接到数据库、执行命令和检索结果的 .NET 数据提供程序。您可以直接处理检索到的结果,或将其放入 ADO.NET DataSet 对象,以便与来自多个源的数据或在层之间进行远程处理的数据组合在一起,以特殊方式向用户公开。ADO.NET DataSet 对象也可以独立于 .NET 数据提供程序使用,以管理应用程序本地的数据或源自 XML 的数据。

ADO.NET 结构

以前,数据处理主要依赖于基于连接的双层模型。当数据处理越来越多地使用多层结构时,程序员正在向断开方式转换,以便为他们的应用程序提供更佳的可缩放性。

ADO.NET 借用 XML 的力量来提供对数据的断开式访问。ADO.NET 的设计与 .NET 框架中 XML 类的设计是并进的——它们都是同一个结构的组件。

ADO.NET 和 .NET 框架中的 XML 类集中于 DataSet 对象。无论 DataSet 是文件还是 XML 流,它都可以使用来自 XML 源的数据来进行填充。无论 DataSet 中数据的数据源是什么,DataSet 都可以写为符合 WWW 联合会 (W3C) 的 XML,并且将其架构包含为 XML 架构定义语言 (XSD) 架构。由于 DataSet 固有的序列化格式为 XML,它是在层间移动数据的优良媒介,这使 DataSet 成为以远程方式向 XML Web services 发送数据和架构上下文以及从 XML Web services 接收数据和架构上下文的最佳选择。

设计 ADO.NET 组件的目的是为了从数据操作中分解出数据访问。完成此任务的是 ADO.NET 的两个核心组件:DataSet 和 .NET 数据提供程序,后者是一组包括 ConnectionCommandDataReaderDataAdapter 对象在内的组件。

ADO.NET DataSet 是 ADO.NET 的断开式结构的核心组件。DataSet 的设计目的很明确:为了实现独立于任何数据源的数据访问。因此,它可以用于多种不同的数据源,用于 XML 数据,或用于管理应用程序本地的数据。DataSet 包含一个或多个 DataTable 对象的集合,这些对象由数据行和数据列以及主键、外键、约束和有关 DataTable 对象中数据的关系信息组成。

ADO.NET 结构的另一个核心元素是 .NET 数据提供程序,其组件的设计目的相当明确:为了实现数据操作和对数据的快速、只进、只读访问。Connection 对象提供与数据源的连接。Command 对象使您能够访问用于返回数据、修改数据、运行存储过程以及发送或检索参数信息的数据库命令。DataReader 从数据源中提供高性能的数据流。最后,DataAdapter 提供连接 DataSet 对象和数据源的桥梁。DataAdapter 使用 Command 对象在数据源中执行 SQL 命令,以便将数据加载到 DataSet 中,并使对 DataSet 中数据的更改与数据源保持一致。

可以为任何数据源编写 .NET 数据提供程序。.NET 框架附带了两个 .NET 数据提供程序:SQL Server .NET 数据提供程序和 OLE DB .NET 数据提供程序。

下图阐释了 ADO.NET 结构的组件。

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

ADO.NET DataSet

DataSet 对象是支持 ADO.NET 的断开式、分布式数据方案的核心对象。DataSet 是数据的内存驻留表示形式,无论数据源是什么,它都会提供一致的关系编程模型。它可以用于多个不同的数据源,用于 XML 数据,或用于管理应用程序本地的数据。DataSet 表示包括相关表、约束和表间关系在内的整个数据集。

下图将显示 DataSet 对象模型。

 

 

DataSet 中的方法和对象与关系数据库模型中的方法和对象一致。

DataSet 也可以按 XML 的形式来保持和重新加载其内容,并按 XML 架构定义语言 (XSD) 架构的形式来保持和重新加载其架构。

使用 ADO.NET 提供的通用接口,您可以编写一组在使用任何 .NET 数据提供程序时都将运行的代码。

当编写将用于多个 .NET 数据提供程序的代码时,请特别注意所使用的任何提供程序特定的语法。例如,根据您所访问的数据源,SQL 语法将有所不同。当更改为一个不同的 .NET 数据提供程序时,如果将 SQL 命令隔离为字符串常数,则将使代码更易于维护。

另外,务必要保持在代码中创建参数的顺序。对于 SQL Server .NET 数据提供程序,参数使用名称来标识,因此参数顺序并不重要。但是,OLE DB .NET 数据提供程序会按照参数添加到参数集合中的顺序来分配参数值。因此,最好始终保持参数在代码中的顺序。

    下面是C#的示例代码:

[C#]

// You can use either:

//  IDbConnection myConn = new SqlConnection();

// or:

//  IDbConnection myConn = new OleDbConnection();

 

IDbCommand myCommand = myConn.CreateCommand();

myCommand.CommandText = "SELECT * FROM Customers";

IDataReader myReader = myCommand.ExecuteReader();

 

while (myReader.Read())

  Console.WriteLine("{0}/t{1}", myReader.GetString(0), myReader.GetString(1));

创建和使用 DataSet

ADO.NET DataSet 是数据的一种内存驻留表示形式,无论它包含的数据来自什么数据源,它都会提供一致的关系编程模型。一个 DataSet 表示整个数据集,其中包含对数据进行包含、排序和约束的表以及表间的关系。

使用 DataSet 的方法有若干种,这些方法可以单独应用,也可以结合应用。您可以:

  • DataSet 中以编程方式创建 DataTablesDataRelationsConstraints 并使用数据填充这些表。

  • 通过 DataAdapter 用现有关系数据源中的数据表填充 DataSet

创建 DataSet

可以通过调用 DataSet 构造函数来创建 DataSet 的实例。请指定一个可选名称参数。如果没有为 DataSet 指定名称,则该名称会设置为“NewDataSet”。

也可以基于现有的 DataSet 来创建新的 DataSet。新的 DataSet 可以是:现有 DataSet 的原样副本;DataSet 的复本,它复制关系结构(即架构)但不包含现有 DataSet 中的任何数据;或 DataSet 的子集,它仅包含现有 DataSet 中已使用 GetChanges 方法修改的行。

以下代码示例演示如何构造 DataSet 的实例。

 [C#]

DataSet custDS = new DataSet("CustomerOrders");

DataSet 添加 DataTable

ADO.NET 使您能够创建 DataTable 对象并将其添加到现有 DataSet 中。可以使用要添加到 DataTableColumns 集合中的 DataColumn 对象的 PrimaryKeyUnique 属性来设置 DataTable 的约束信息。

以下示例构造一个 DataSet,将一个新的 DataTable 对象添加到该 DataSet 中,然后将三个 DataColumn 对象添加到该表中。最后,该代码将一个列设置为主键列。

[C#]

DataSet custDS = new DataSet("CustomerOrders");

 

DataTable ordersTable = custDS.Tables.Add("Orders");

 

DataColumn pkCol = ordersTable.Columns.Add("OrderID", typeof(Int32));

ordersTable.Columns.Add("OrderQuantity", typeof(Int32));

ordersTable.Columns.Add("CompanyName", typeof(string));

 

ordersTable.PrimaryKey = new DataColumn[] {pkCol};

创建和使用数据表

DataSet 由表、关系和约束的集合组成。在 ADO.NET 中,DataTable 对象用于表示 DataSet 中的表。DataTable 表示一个内存内关系数据的表;数据对于它驻留于其中的基于 .NET 的应用程序来说是本地数据,但可从数据源(例如,使用 DataAdapter 的 Microsoft® SQL Server)中导入。

DataTable 类是“.NET 框架类库”中 System.Data 命名空间的成员。您可以独立创建和使用 DataTable,或者可以将其用作 DataSet 的成员,而且 DataTable 对象也可以与其他 .NET 框架对象(包括 DataView)一起使用。您可以通过 DataSet 对象的 Tables 属性来访问 DataSet 中表的集合。

表的架构或结构由列和约束表示。使用 DataColumn 对象以及 ForeignKeyConstraintUniqueConstraint 对象定义 DataTable 的架构。表中的列可以映射到数据源中的列、包含从表达式计算所得的值、自动递增它们的值,或包含主键值。

除架构以外,DataTable 还必须具有行,在其中包含数据并对数据排序。DataRow 类表示表中包含的实际数据。DataRow 及其属性和方法用于检索、计算和操作表中的数据。在访问和更改行中的数据时,DataRow 对象会维护其当前状态和原始状态。

您可以使用表中的一个或多个相关的列来创建表与表之间的父子关系。DataTable 对象之间的关系可使用 DataRelation 来创建。然后,DataRelation 对象可用于返回某特定行的相关子行或父行。

创建数据表

DataTable 表示一个内存内关系数据的表,可以独立创建和使用,也可以由其他 .NET 框架对象使用,最常见的情况是作为 DataSet 的成员使用。

DataTable 对象可通过使用 DataTable 构造函数来创建,或者可通过将构造函数参数传递到 DataSetTables 属性的 Add 方法(它是一个 DataTableCollection)来创建。

DataTable 对象可通过使用 DataAdapter 对象的 Fill 方法或 FillSchema 方法在 DataSet 内创建,或者可使用 DataSetReadXmlReadXmlSchema InferXmlSchema 方法从预定义的或推断的 XML 架构中创建。请注意,将 DataTable 添加为一个 DataSetTables 集合的成员后,不能再将其添至任何其他 DataSet 的表的集合。

最初创建 DataTable 时,它是没有架构(结构)的。要定义表的架构,必须创建 DataColumn 对象并将其添至表的 Columns 集合。您也可以为表定义主键列,而且可以创建 Constraint 对象并将其添至表的 Constraints 集合。在为 DataTable 定义了架构之后,可通过将 DataRow 对象添至表的 Rows 集合来将数据行添加到表。

创建 DataTable 时,不需要为 TableName 属性提供值,您可以在其他时间指定属性,或者将其保留为空。但是,在将没有 TableName 值的表添至 DataSet 时,该表就会得到一个递增的默认名称 TableN,此名称以“Table”开头,从 Table0 开始。

注意 建议您在提供 TableName 值时避免使用“Table”或“TableN”的命名规则,因为您提供的名称可能会与 DataSet 中现有的默认表名称冲突。如果提供的名称已经存在,将引发异常。

以下示例创建 DataTable 对象的实例,并为其指定名称“Customers”。

 [C#]

DataTable workTable = new DataTable("Customers");

以下示例创建 DataTable 实例,方法是:将其添至 DataSetTables 集合。

 [C#]

DataSet custDS = new DataSet();

DataTable custTable = custDS.Tables.Add("CustTable");

创建和使用 DataView

DataView 使您能够创建 DataTable 中所存储的数据的不同视图,这种功能通常用于数据绑定应用程序。使用 DataView,您可以公开表中具有不同排序顺序的数据,并且可以按行状态或基于筛选器表达式来筛选数据。

DataView 提供数据的动态视图,其内容、排序和成员关系会实时反映对基础 DataTable 的更改。它不同于 DataTableSelect 方法,后者从表中按特定的筛选器和/或排序顺序返回 DataRow 数组,虽然其内容反映对基础表的更改,但其成员关系和排序却则保持静态。DataView 的动态功能使其成为数据绑定应用程序的理想选择。

与数据库提供的视图类似,DataView 为您提供了可向其应用不同排序和筛选条件的单个数据集的动态视图。但是,DataView 和数据库视图之间相当不同的一点在于 DataView 不能作为表来进行处理,并且不能提供联接表的视图。另外,还不能排除存在于源表中的列,也不能追加不存在于源表中的列(如计算列)。

可以使用 DataViewManager 来管理 DataSet 中所有表的视图设置。DataViewManager 为您提供了一种方便的方法来管理每个表的默认视图设置。在将一个控件绑定到 DataSet 的多个表时,绑定到 DataViewManager 是理想的选择。

创建 DataView

创建 DataView 的方法有两种。可以使用 DataView 构造函数,也可以创建对 DataTableDefaultView 属性的引用。DataView 构造函数可以为空,也可以通过单个参数的形式采用 DataTable 或者同时采用 DataTable 与筛选条件、排序条件和行状态筛选器。有关可与 DataView 一起使用的附加参数的更多信息。

由于在创建 DataView 时以及在修改任何 SortRowFilterRowStateFilter 属性时都会生成 DataView 的索引,所以当创建 DataView 时,通过以构造函数参数的形式提供任何初始排序顺序或筛选条件,将实现最佳性能。如果在不指定排序或筛选条件的情况下创建 DataView,然后设置 SortRowFilterRowStateFilter 属性,则会使索引生成至少二次:一次是在创建 DataView 时,另一次是在修改任何排序或筛选属性时。

请注意,如果使用不采用任何参数的构造函数来创建 DataView,那么在设置 Table 属性之前,将无法使用 DataView

以下代码示例演示如何使用 DataView 构造函数来创建 DataViewRowFilterSort 列和 DataViewRowState 将与 DataTable 一起提供。

 [C#]

DataView custDV = new DataView(custDS.Tables["Customers"], 

                               "Country = 'USA'", 

                               "ContactName", 

                               DataViewRowState.CurrentRows);

以下代码演示如何使用该表的 DefaultView 属性获取对 DataTable 的默认 DataView 的引用。

 [C#]

DataView custDV = custDS.Tables["Customers"].DefaultView;

总结

    上面是VS.NET中ADO.NET的一些主要的特性,给大家参考一下。有任何建议请MAIL我 paulni@citiz.net

ADO.NET操作数据库(三)

自己的总结: 连接对象、命令对象 、Sql参数对象 SqlDataAdapter其实是对数据操作的封装,让我们写代码变得简单了,adapter是转换器的意思,不需要关心适配器内部是怎么实现的,它能...
  • chenrushui
  • chenrushui
  • 2016年11月02日 20:45
  • 985

ado.net连接数据库简单例子

本地连接一台服务器上的数据库,对其进行查询、插入、删除等操作: 1、需要ip地址,需要数据库的名称,需要一个SQL Sevrer账户; 2、查询操作:             //用于连接的字符串支持...
  • u012839396
  • u012839396
  • 2015年04月24日 17:13
  • 4508

C++ 通过ADO.Net实现与MySql数据库连接 入门教程

C++ 通过ADO.Net实现与MySql数据库连接 入门教程前言
  • u013978977
  • u013978977
  • 2016年07月15日 17:15
  • 615

ADO.NET操作数据库(二)

核心内容:SqlHelper的封装、配置文件的使用、事件监视器、ado.net数据库连接池、可变参数、异常捕获、SQL漏洞注释攻击、使用带参数的sql语句、本文中出现的类的用法。 一:关于SqlHel...
  • chenrushui
  • chenrushui
  • 2016年10月30日 18:31
  • 1289

ADO.NET访问数据库的方式

ADO.NET数据访问编程模型          早期的数据处理主要依赖基于连接的双层模型,当数据处理越来越多地使用多层模型时,就必须考虑非连接方式下的数据处理模型,以提高应用程序的可...
  • ygz5175526
  • ygz5175526
  • 2014年07月31日 16:16
  • 565

C# ADO.NET的五个常用对象及数据库连接操作

C#中和数据库连接的操作时开发中必不可少的,而ADO.NET就是其中的关键技术之一。常见的ADO.NET有五个常用的对象: SqlConnection 数据库连接对象 SqlCommand 数据...
  • ZorroBubble
  • ZorroBubble
  • 2013年06月13日 09:56
  • 2702

数据库访问方式(ODBC OLEDB ADO ADO.NET)

ODBC(Open Database Connectivity,开放数据库互连) 1992年,微软公司开放服务结构(WOSA,Windows Open Services Architecture)中有...
  • lxd8731247769
  • lxd8731247769
  • 2016年01月02日 09:36
  • 1614

ADO.NET操作数据库(四)

主要内容: 连接查询、左表、右表、内连接、外连接、笛卡尔积、on子句数据筛选、自连接、存储过程、连接查询、模糊查询、视图、T-SQL编程、全局变量、局部变量、事务、系统存储过程、用户自定义存储过程、a...
  • chenrushui
  • chenrushui
  • 2016年11月09日 19:45
  • 1685

ADO.Net都有哪些从数据库获取数据的方式

2005年10月07日 20:15:00 (一).说明 初学ADO.Net会被ADO.Net访问数据库方式弄得头晕,感觉无从下手.本文将它们整合在一起,文章并没有涉及太多深层知识....
  • softart
  • softart
  • 2007年12月14日 11:47
  • 372

使用ADO.NET对SQL Server数据库进行访问

在上一篇博客中我们给大家简单介绍了一下VB.NET语言的一些情况,至于理论知识的学习我们可以利用VB的知识体系为基础,再将面向对象程序设计语言的知识进行融合便可进行编程实战。          如果我...
  • u010929604
  • u010929604
  • 2014年06月01日 20:05
  • 4512
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用ADO.NET访问数据库
举报原因:
原因补充:

(最多只允许输入30个字)