戴南的ArcGIS's Blog
ArcGIS的开发应用

导航

统计
 

 

Accessing and Updating Data in ASP.NET 2.0: Data Source Control Basics
By Scott Mitchell

翻译: 戴南 北京信息工程学院 

序:

ASP.NET 2.0中新近引入了一系列的用来访问和更新数据的WEB控件。这些控件的出现使得网页开发人员可以以声明式的编程方式访问并对数据进行操作,摈弃了原来那种编写数据访问代码的方式。本篇文章是我所写的关于ASP.NET 2.0中最新的数据源控件文章系列专题中的一个。

·数据源控件的基础知识 探究数据源控件的基本概念以及它的优点,并且与ASP.NET 1.x平台中的数据访问技术做了一个初步的比较。

·访问数据库中的数据 展示如何通过SqlDataSource以及AccessDataSource控件从一个关系形数据库中查询并获得数据。

·使用参数对数据库数据进行筛选 学习如何使用硬编码的参数值以及QueryString查询字符串传递来的参数值,或者是其他WEB控件传递的值,Session会话变量值等参数进行筛选,来获取一个数据库中的数据的子集。

·使用XmlDataSource控件访问XML数据 了解如何访问位于远程以及本地的XML数据并且将这些数据显示于WEB控件中。

·创建自定义的参数控件 学习如何创建自定义的、声明式的参数控件,该控件基于数据源控件的参数集合。

·了解数据源控件的事件机制 探究数据源控件的整个生命周期中,如何触发事件。


 

 Data Source Control Basics - 数据源控件基础

原文地址:Data Source Control Basics

前言:

当我开始自己的程序员生涯时,微软的ASP 2.0技术刚刚出现在我的视野之内(经典ASP,绝非.NET)。回首往事,WEB程序员要同时负责访问以及显示数据的代码的编写。也就是说,我们为了查询数据库不得不编写大量代码并且还得写许多相关的HTML元素来呈现出我们所要显示的数据。ASP.NET version 1.x 利用WEB数据控件简化了这一开发流程。(如DataGrid, DataList, Repeater, DropDownList控件)大多数情况下只需要编写两行简短的代码就可以使得这个WEB数据控件从任意的数据源获取数据,并以每个控件已经定义好的固有的HTML元素来呈现出这些数据。

而时过境迁,在今日的开发环境中,我们使用ASP.NET 2.0以及它所引入的数据源(DataSourceControl)控件,就可以在不写一行代码的情况下直接访问数据并显示出来,多么诱人呢。

 简单说来,ASP.NET 2.0下的数据源控件提供了一种声明式的编程方式来与数据进行交互操作。与过去相比,我们不再需要为了连接数据库而编写代码,不用再建立一个命令对象,也不用去获取Datareader数据阅读器对象或者DataSet数据集对象。因为使用了数据源控件,我们可以直接在HTML源代码中为数据源控件的基本属性进行定义(当然,在这些行为的背后,数据源控件完成的工作其实与我们曾经在ASP.NET 1.x下所需要编写的代码所体现的行为是一致的。)。当数据源控件被正确配置好以后,我们就可以将其绑定至任意的一个WEB数据控件上了。当含有数据源控件的ASP.NET页面被访问的时候,WEB数据控件会自动从其所关联的数据源控件处获取所需要的数据。

 虽然数据源控件是很容易上手使用的,但是我相信仍会有一堆令我们头疼的事情发生(看似简单的事情背后往往蕴涵着更深刻的道理。)。在下文中,我们将一起了解ASP.NET 2.0平台下5个原生数据源控件的细节内容。不过首先,让我们先了解下关于这些控件的基本概念,以及ASP.NET 2.0下的WEB数据控件是如何与与之绑定的数据源控件在运行时中协同工作的。

 

其实旧的开发方法仍在被人们使用!

做为程序员,在ASP.NET 2.0中你仍然可以象在ASP.NET 1.x中那样去访问并更新数据,也就是说,你不但可以使用SqlConnectionSqlCommandSqlDataReader类来访问数据,还可以将结果集绑定到WEB数据控件上去。或许对我们来说,数据源控件只是提供了一种声明式的,更有效率的与数据进行交互的方式吧。

 

 

数据源控件的优势

ASP.NET 1.x较之前辈,经典ASP,最大的改进莫过于它所提供的WEB数据控件自己可以生成呈现数据所需要的HTML代码,而无需编写太多的代码。这一方式主要有2个方面的优势,其一,为WEB程序员节省了大量过去所需的编码时间,同时也使得程序员不用再过多的了解专业领域的知识(如HTML元素的组织与编写)。在经典ASP中,当我们需要将数据呈现于页面之上的时候,我们都需要编写代码对数据集中的数据进行遍历,然后不仅仅要将当前的数据记录显示出来,还需要将与之有关的HTML呈现代码写出来。

 比如,为了将数据集合显示在一个<table>元素中,在经典ASP开发中,我们首先需要编写代码去访问数据库,并且在获取到数据以后,首先要将表格元素的开始标记<table>输出,然后遍历RecordSet对象中的数据。每一条数据,在表格中都是做为一行呈现出来,所以在输出每一条数据之前,都要先输出一个行<tr>开始标记,然后遍历这一条记录中的所有字段,而每个字段在表格中是以单元格的形式呈现的,所以在显示每一个字段的内容时,我们首先要将一个<td>单元格开始标记输出出来,这样在结束数据遍历以后,我们再输出一个表格的结束标记</table>。我相信如果你从没有编写过经典ASP脚本的话,那么对你来说是莫大的幸运 因为经典ASP的代码结构是天生的杂乱无章的,特别是要对动态数据进行更多的格式化的时候,这一问题就显得尤为突出了。比如我们需要在行上面使用交替的背景颜色,或者将字段的值根据不同的条件予以处理再输出出来,这些都会将问题突现出来。而在ASP.NET 1.x中所提供的WEB数据控件则恰恰解决了这个问题,使得我们不再为代码的混乱膨胀而头疼,不必再去编写过多的代码就可以轻松解决问题。

 另外使用ASP.NET 1.x下的WEB数据控件不但大大降低代码编写量,同时也在一定程度上避免了牵涉到过多的领域知识。比如在经典ASP中,WEB程序员必须准确的知道HTML元素<table>所关系到的语法以及语义。但是对于一个ASP.NET程序员来说,只要使用DataGrid控件来呈现数据的话,那么他甚至都不用知道一点关于如何绘制一个表格元素的HTML语法。同样的,一个ASP.NET程序员在使用DropDownList控件时,只需要简单的将数据结果绑定到控件上就可以了,而不需要更多的去关注<select>元素和<option>元素的概念。

 即使不同的控件在呈现数据的过程上是不同的,但是ASP.NET 1.x下的WEB数据控件提供了一种一致的模式来显示数据。不管是DataGrid将数据呈现在一个表格中,还是象DropDownList那样将数据呈现在一个下拉框中,这些控件底层对于数据的绑定过程都是一致的,那就是设置好WEB数据控件的DataSource属性并且在页面生命周期中引发Databind()方法。

 使用WEB数据控件来呈现数据的优点也同样惠及对数据的访问上。在ASP 1.x中,但凡涉及到数据操作的地方,都需要许多重复的编码以及许多领域知识。虽然Data Access Application Block库文件将这些都抽象化以减少不必要的重复,或者利用一些经过优秀设计的应用架构也有助于减少网站实施者对于专业领域知识的需求,但是总的说来在ASP.NET 1.x中数据访问技术仍然与经典ASP应用程序有许多相似之处。

 ASP.NET 2.0中,数据源控件为数据显示层以及数据访问层的编写带来了许许多多的便捷。数据源控件ASP.NET网站开发人员提供了一个新颖的方式去访问并修改数据,而不需要我们去编写一行代码。这个控件的出现大大减少了在ASP.NET 1.x中大量出现的代码冗余现象。

 此外,我们注意到随着ASP.NET 2.0的发布,其同时提供了5个原生的数据源控件,用来访问5种最常用格式的数据源。比如SqlDataSource控件,可以用来访问关系型数据库,同样的XmlDataSource可以访问XML文件。不论我们使用的是哪种原生数据源控件,这些控件与WEB控件集成的方式都是相同。这样一种设计模式大大减少了我们对不同类型数据进行访问所需要的专业知识。或许我们都不需要知道如何连接到一个Microsoft SQL Server 2000 数据库服务器,也不需要知道如何从XML文件中获取节点并筛选出我们所需要的内容。因为有了数据源控件,一切都变得如此简单,因为它帮我们将数据访问的专业知识抽象出来了,我们只需要关心我们实际需要关心的知识就可以了。

 

无需掌握领域知识-是好是坏?

ASP.NET 2.0内建的WEB数据控件与数据源控件允许WEB开发人员在不了解数据输入和输出机制的情况下,就可以建立一个基于数据驱动的WEB应用程序。因为数据源控件大大减少了我们所需了解的专业知识,如连接、查询数据库等一系列与数据库直接打交道的事情,而同时WEB数据控件也将具体的HTML呈现代码封装于内部。一方面来看,这样做为那些没有扎实的WEB开发基础的人们创造了一个便于他们学习发展的空间。另一方面,同样使得我们的项目开发可以更快地进行,因为我们不再需要将我们的时间精力都集中在那些高深莫测的专业知识上面了。

然而,从另一个角度来看,在已有的架构上抽象出新的层来,也使得我们开发人员自然而然地放弃了对底层模型的关注。项目可能会很顺利地进行着直到我们发现已经走了一个很长的弯路,我们发现层与层之间的界限被打破了(泄露产生了),全部都混为一谈了(你不得不面对底层的细节)。从这一点上看开发人如果只熟悉使用数据源控件而不熟悉涉底层架构,那么一切看来都是那么可靠的。

我的意思并不是要大家说,哦,好吧,我不再学习如何使用数据源控件了,不是这样的;我也不是告诉大家无须了解数据访问的基础知识就可以顺利编程的那一天已经到来了。更准确的说,让我引用一段Joel Spolsky的一篇很有名的文章中的一句话,他在The Law Of Leaky Abstractions(抽象层的泄露)一文中说过:首先自己去实践如何去访问并更新数据,并在我们了解了底层机制后,我们就可以使用[数据源]控件来为我们的开发节约时间。就如同代码自动化生成工具一般,使用这些工具可以将许多对象都提取出来单独抽象出来,但是只有当我们明白这些抽象出的层是如何运做的并且这些层将什么抽象出来的时候,我们才能正确的处理好抽象层的泄露问题。因为抽象在一定程度上为我们节约了许许多多宝贵的时间,但是不可能减少了我们学习知识的过程。

总之,所有这些都说明了一个很滑稽的事情,即使我们有了更高级的编程工具,以及更好的抽象方式,但是变成一个优秀的程序员却非易事。

 

数据源控件的实现机制。

如果从表面上看某一个数据源控件都会提供与其他数据源控件所不同的一些方法,但是他们总归是拥有一组相同的特性的控件。从理论上讲,一个数据源控件是一组DataSourceView(下称,数据源视图)的集合,而一个数据源视图表示一组数据的集合。所有的数据源控件都实现了IDataSource接口,这个接口位于System.Web.UI命名空间下。这个接口定义了一组方法与一个事件的签名,与数据源视图最密切关联的应该就是其中的GetView(viewName)方法了。正如其名,这个方法返回一个数据源视图对象。

 在这个基础上,不同的数据源控件实现了对不同数据源的支持。例如,SqlDataSource,使用SqlDataSourceViews一个被定义用来表示关系形数据库中获取到的数据的对象。无论如何区分数据源控件,ASP.NET中的WEB数据控件以一种同样的方式来使用这些数据源控件,正如我们所见到的非常简洁的方式。

 绑定一个数据源控件到WEB数据控件。

因为数据源控件是声明式控件,正如其他ASP.NETWEB控件诸如LabelsTextBoxesButtons等等。所以数据源控件可以通过简单的拖拽,从工具箱中拖放到页面中。只要数据源控件被放入页面上,他的属性就可以被任意设置了,以访问并对数据进行正确的操作。这一过程是如何完成的取决于我们使用的是哪一种数据源控件了(决定了我们可以访问哪种数据格式)。当数据源控件被正确设置以后,我们就可以将其绑定到一个WEB数据控件上去了,只要将WEB数据控件的DataSourceID属性设置为数据源控件的ID,就可以了(只有继承自BaseDataBoundControl类的控件才有这个DataSource属性。在已有的ASP.NET控件中,有以下控件符合要求:AdRotator, BulletedList, CheckBoxList, DropDownList, ListBox, RadioButtonList, DetailsView, FormView, GridView, Menu, and TreeView)。

当被绑定的数据控件的DataSourceID 属性被正确设置为一个数据源控件后,做为一个程序员的使命其实已经完成了。在ASP.NET页面的生命周期中,WEB数据控件将使用与其绑定的那个数据源控件来查询其所需的数据。例如:当在一个GridView ASP.NET 2.0DataGrid的替代控件)中显示数据时,使用一个SqlDataSource控件,这个GridView控件将引发SqlDataSource控件的GetView()方法。接下来,数据源控件将使用其自身属性中所指定的参数从数据库中获取数据。获取到的数据将被GridView列举出来并呈现为一个HTML <table>元素。

这就是使用数据源控件的整个过程了。通过使用数据源控件,程序员可以连很少的代码都不用写,正如同WEB数据控件不用写代码就可以获取到数据一样,WEB数据控件封装了列举数据并将数据呈现出来的过程,而数据源控件也同样是这样实现的。(在这个系列讲座中我们将实践如何正确设置数据源控件的各个属性值,如果有时间的话,也可以看下A Sneak Peak at Working with Data in ASP.NET 2.0 这个文章,可以了解到如何在Visual Studio 2005中使用SqlDataSource!)

 小结

在这一讲中,我们讲述了ASP.NET版本2.0中数据源控件的设计思想与实现机制。我们了解到通过使用数据源控件,程序员可以在不需要考虑数据访问层的编码的情况上,实现一个由数据驱动的网站应用程序,只要使用声明式的数据源控件就可以了。当数据源控件被拖放到页面中并且被正确设置以后,就可以被绑定到一个WEB数据控件上,我们只要通过设置WEB数据控件上的DataSourceID属性就可以轻松完成整个绑定的过程了。当这个关联完成以后,在相应的页面生命周期中,WEB数据控件将自动地从与之绑定的数据源控件上获取数据了。

 在这个系列讲座的未来几讲中,我们还将更细致的了解如何使用ASP.NET 2.05个原生的数据源控件。

Happy Programming!

· By Scott Mitchell

posted on 2006-11-27 04:05  戴南  阅读(...)  评论(...编辑  收藏