.net 中的数据访问 读取数据 dataset、datatable 和 recordset 转换现有代码 更新数据 xml 扩展支持 总结 自若干年前推出开放式数据库连接 (odbc) 应用程序编程接口 (api) 以来,出现了各种各样的数据库访问技术,而 ado.net 是其中最新的一种。在这过程中,发生了许多有趣的事。例如,com 闯入数据库领域,开始培植 ole db 的殖民进程。然后,大致相当于 ole db 自动化版本的 activex® data objects (ado) 被选来统治 windows® 数据库开发者的 visual basic® 和 asp 社区。 通过 .net,microsoft 正在提供通用框架(即 framework class library),其中将包括所有现有的 windows api 甚至更多的内容。特别值得一提的是,它包括大量常用的库,而这些库现在需要通过各个 com 对象分别获得。在这些库中,您会发现 xml 和 ado 对象模型,它们被集成到了叫做 ado.net 的类子树中。 ado.net 事实上成为构建数据感知 .net 应用程序的基础。和 ado 不同的是,ado.net 遵循更通用的原则,不那么专门面向数据库。ado.net 集合了所有允许数据处理的类。这些类表示具有典型数据库功能(如索引、排序和视图)的数据容器对象。尽管 ado.net 是 .net 数据库应用程序的权威解决方案,但从总体设计上来看,它不象 ado 模型那样以数据库为中心,这是 ado.net 的一大特点。 ado.net 与 ado 有很大差异。ado.net 是新的数据访问编程模型,需要开发人员的全面理解、投入和新思维。然而,一旦开始掌握 ado.net,您将意识到:原有的 ado 技巧非常有助于您以不同、却更巧妙和可靠的方式来创建有效的应用程序和解决各种老问题。 在这篇文章的其余部分,我将集中介绍如何以 ado.net 方式实现基本的数据库操作。我想说明,在什么时候 ado.net 是比 ado 更好的选择,而您最好在什么时候应放弃 ado。ado.net 并不是将 ado 改良以符合 .net 基础结构而形成的。只要您看一下 ado.net 的语法、代码设计和移植,就会明白这一点。
.net 中的数据访问
在 ado.net 中访问数据源的方式由托管提供程序确定。从功能上讲,托管提供程序与 ole db 的提供程序非常相似,但有两个重要的不同之处。首先,管理提供程序在 .net 环境中工作,通过 datareader 和 datatable 等 .net 类检索和公开数据。其次,因为它们的体系结构针对 .net 进行了优化,所以比较简单。 目前 ado.net 提供了两种托管提供程序:一种用于 sql server™ 7.0 或更高版本,另一种用于其他所有您可能已经安装的 ole db 提供程序。在这两种情况下您分别使用不同的类,但遵循相似的命名规则。除前缀外,名称都是相同的。前一种情况前缀为 sql,后一种情况则是 ado。 您应该使用 sql 类访问 sql server 表,因为它们直接进入数据库服务器的内部 api,跳过了由 ole db 提供程序表示的中间层。ado 类是 ole db 提供程序上的 .net 接口,它们使用 com interop 桥进行工作。 ado.net 对象的初学者可参阅 omri gazitt 的文章介绍 ado+:用于 microsoft .net 框架的数据访问服务(英文)和我的 ado+ 推动数据种类的演变(英文)一文。前者技术性较强,针对 ado.net 程序模型提供了高水平的评注性概述。后者主要介绍 ado.net 的目标和它与 xml、脚本以及其他技术之间的联系。
读取数据
需要从数据源中读取数据的 ado.net 应用程序首先要创建连接对象。根据目标提供程序的不同,该连接对象可以是 sqlconnection 或 adoconnection。请记住,您可以使用 ado.net 类来连接到 sql server 数据库,但我们不建议这样做。其唯一的缺点是,您的代码要通过不必要的额外代码层。它先将 ado 的托管提供程序调入,然后托管提供程序再调用 sql server ole db 提供程序。而 sql server 托管提供程序和 ole db 提供程序一样直接操作数据。 ado 和 ado.net 连接对象之间的显著差异是:ado.net 连接不支持 cursorlocation 属性。请注意,这并不是一个文档错误,而是一个有争议的设计问题。为了突出以数据为中心的原则,ado.net 没有游标的显式实现。 在 ado 中,您习惯了用游标从数据库或其他任何 ole db 兼容的数据源中抽取记录。您可以选择客户端或服务器游标,每种游标都有几个预先设定的游标类型。ado.net 则设计为从数据源中抽取数据,并提供新的编程接口来读取和分析数据。 在 ado 中,您通过指定连接和命令文本来创建 recordset 对象。对于游标的位置和类型,recordset 有一定策略。您可以按下列方式之一读取数据: