在Visual Studio 2005和ASP.NET 2.0中使用强类型数据存取

asp.net|visual|数据

"Never put off until run time what can be done at compile time."
David Gries, Compiler Construction for Digital Computers

Introduction

  作为程序员,我们在学习一些新技术的时候,范例有时候会是我们最大的敌人。指南通常被设计成简单易懂,但同时里面的懒惰、无效率的甚至是危险的代码编写会增多。像这种情况最普遍存在的就是在ADO.NET的范例中了。在这篇文章中,我们将看一下数据库中的强类型对象有什么意义,会让你在你的程序中这样做,尽管缺乏范例。
  有点特别的是,我们将看到在Visual Studio 2005中是如何创建和使用强类型数据集的。正如这篇文章所探究的,与另外一种弱类型数据存取技术相比,强类型数据集提供了许多有利之处。我们也会在这里看到,用Visual Studio 2005创建和使用强类型数据集并没有变得更简单。想学更多就继续看下去吧。

The Basics and Benefits of Strongly-Typed Objects

  要想明白强类型是什么意思,你可以先想想约会。如果你是单身,你会考虑跟哪种类型的人约会呢?你可能有一些特定的标准(比如健康和有魅力),又或者标准很简单或并不是很明确。无论你的条件是什么,当你决定更多地与谁一起的时候,你总会用自己对这一些类型的一定的标准去衡量考虑。如果你很聪明,你会想一大堆来保护自己不受感情创伤。你可能会发现,比如说,与一个酒鬼相处是很不稳定,除非两人之间有一个认真的关系。但是,让一个人改变是很痛苦并且非常困难的。因此,你的智慧会指示你让你在这段关系开始前就叫停。给你的约会标准里加一个不喝酒的条款会保护你不会在未来心痛,并且让你可以更专心的把你的时间和精力放在更好的候选人身上。
  你可能在惊讶这个推理与编程有什么关系。没关系,跟我来吧,可爱的读者!ADO.NET数据存取对象是被设计成极富弹性的。当你从数据库中读取数据时,你可能是用许多平常.NET framework允许的的通用类型的对象在工作,除非遇到特殊的问题。应用我们的约会理论,基本上可以把你的相关数据看作是通用对象。“我约会的只要不是太麻烦的就好了。”难道你就不能再明确一点吗?甚至连是人还是其它生物都没有限制!作为你的朋友,我恳求你,“多点标准吧!让你的清单缩小一点!”
  正如你如果忽视约会的对象是谁会导致将来的关系问题一样,在你的代码中放任你的objects也会造成一些错误。并且,如果你让旧的object在你的子程序中漫舞,你可能直到程序运行执行时才会发现这是个问题。用我们的约会理论来看,在运行时捕捉错误就好像你的约会在一间新潮的意大利餐馆中间发生痛苦和难堪的争吵一样。是的,你发现了,如果你在之前先有计划,你就不会在一堆用餐者的注视中结束这个场面,也不会很难堪。只要在你的代码里简单地应用一些严格点的标准,你就可以在程序开始编译前捕捉到错误。比如下面这句代码例子:

string FirstName = myrow.("FirstName").ToString();   
  这个例子中的DataRow是无类型的,结果就是,你必须要用列的名字作字符串去得到你所需要的值(或者你可以选用这个列在记录的列集合中的索引)。好在那一列确实存在。DataRow的列的数据类型是object,我们假定这个FirstName列下面的数据类型是string,而且我们在使用之前必须要把它显式转换成string。如果这一列的名字发生变化(例如变成PersonFirstName),编译器并没有办法通知你。郁闷吧?但你可以不这样的。如果你的代码像下面这样,你的生活就会更简单,你的代码就会更可靠。

string FirstName = PersonRow.FirstName;

  在这第二个例子中,我们用一个强类型的行,并且我们知道FirstName属性是string类型的。没有凌乱的列名,也没有乱七八糟的类型转换。编译器已经为我们做了类型检查,我们可以放心的进行其它工作,而丝毫不用担心是否把列名敲对了。
  其它所有的东西都是一样的,所以你肯定会毫不犹豫地使用这种方式,而不再使用通用类型的方式。但请等一下,强类型objects是从哪里来的?我也希望我可以告诉你这些objects是自动创建的。但是,正如良好的关系需要时间和精力一样,让你的objects强类型也需要额外的努力。但花在这里的额外时间绝对是值得的,它也节省了在未来“捉臭虫”时花费的更多的指数级的时间。
  完成强类型有好几种方法,我们将在这篇文章余下的部分介绍如何在Visual Studio 2005中创建强类型的数据集。我们也会把这种做法与其它做法的优缺点作一个比较。

Creating Strongly-Typed DataSets in Visual Studio 2005

  强类型数据集其实只是把普通数据集的列和表预先定义好,所以编译器已经知道它们包含什么。取代你好像带着棒球手套弄的松散的包装,强类型数据集正像一个非常合适的手套。而Visual Studio的每一次连续的版本都使得数据集强类型化的处理更加简单。在下面这个例子中,我们将使用SQL Server 2005的AdventureWorks数据库。简单地执行下面一些步骤:
1. 打开Visual Studio,创建一个新的ASP.NET网站。
2. 在Solution Explorer窗口,右键点击新增一个项,选择DataSet。给其命名为AdventureWorks.xsd(见截图)。Visual Studio将推荐你把DataSet文件放进App_Code文件来,你只要点同意就可以了。
3. 打开AdventureWorks.xsd之后是设计模式,TableAdapter配置向导将会运行。这时候,点取消,我们将从Server Explorer中把所要的表拖进来。
4. 在Server Explorer工具栏中浏览找到AdventureWorks数据库。(如果你还没有安装AdventureWorks数据库,你可以去微软的下载页面SQL Server 2005 Samples and Sample Databases下载它和一些其它的SQL Server 2005示例)
5. 把SalesOrderHeader表和SalesOrderDetail表拖进DataSet的设计窗口。窗口应该会像截图中一样。我们看到的是什么呢?每当我们增加一个表,Visual Studio就会创建一个强类型DataTable(名字和原来的表一样)和一个TableAdapter。这个DataTable已经为我们定义好每一列。TableAdapter是我们用来填充表的,默认有一个Fill()方法从原表中得到每一行数据。

  照原来的样子的话,这个强类型数据集将会返回这两个表的所有记录。但是AdventureWorks数据库包含了许多订单信息,因此为什么不创建一个更明确的查询呢?我们可以给TableAdapter对象增加方法来获取一个特定的子记录集。右键点击SalesORderHeaderTableAdapter,然后选择Add|Query。选择“Use SQL statements”后点下一步,然后选择“SELECT which returns rows”再点下一步。最近,在窗口中输入下面的查询语句(或者可以使用Query Builder来完成这项工作):

SELECT
     SalesOrderID, RevisionNumber, OrderDate, DueDate, ShipDate,
     Status, OnlineOrderFlag, SalesOrderNumber, PurchaseOrderNumber,
     AccountNumber, CustomerID, ContactID, SalesPersonID, TerritoryID,
     BillToAddressID, ShipToAddressID, ShipMethodID, CreditCardID,
     CreditCardApprovalCode, CurrencyRateID, SubTotal, TaxAmt, Freight,
     TotalDue, Comment, rowguid, ModifiedDate

FROM Sales.SalesOrderHeader
WHERE (OrderDate > @OrderDate)
  这个SQL查询是一个简单的SELECT查询,用了一个@OrderDate参数以筛选结果。这将使我们不用返回数据库中的所有记录。保持“Fill a DataTable”和“Return a DataTable”复选框的选中,点完成。把这个SELECT语句加完之后你的设计器现在应该像截图一样,在SalesOrderHeaderTableAdapter下面多了一个查询。

  强类型数据集建立起来以后,我们就可以轻易地用几行代码在ASP.NET页面中把数据显示出来。在网站里新建一个ASP.NET页面并转到设计模式。拖一个GridView控件到上面,保留它的ID为GirdView1。然后到源代码页中,在文件的上方将AdventureWorksTableAdapters命名空间引入(在c#里面语法是using AdventureWorksTableAdapters;)。最后在Page_Load事件里增加下面的代码:

// Create the SalesOrderHeaderTableAdapter
SalesOrderHeaderTableAdapter salesAdapter =
    new SalesOrderHeaderTableAdapter();

// Get orders that took place after July 1st, 2004
AdventureWorks.SalesOrderHeaderDataTable Orders =
    salesAdapter.GetDataBy(new DateTime(2004, 7, 1));

// Bind the order results to the GridView
this.GridView1.DataSource = Orders;
this.GridView1.DataBind();    

  代码非常简单。我们创建一个SalesORderHeaderTableAdapter的实例以填充数据表。这里要注意的是,不同于普通的DataTable,我们声明了一个SalesORderHeaderDataTable类型的对象,我们调用GetDateBy()方法,传递一个DateTime对象来填充数据。这里也要注意,获取的命令也是强类型的,因此我们必须传递一个DateTime对象,而不是一个普通的对象。下面的截图即是上面代码示例的结果。

  除了用代码把结果集绑定到GridView外,你也可以用一个ObjectDataSource,把它的TypeName属性设成AdventureWorksTableAdapters.SalesOrderHeaderTableAdapter,把它的SelectMethod设置成GetData或者GetDataBy。
除了连接数据库不需要写代码之外,使用强类型数据集的另一大优点是不存在编译器无法检查的潜伏在我们的代码中的列名字符串。我们也不需要进行任何类型转换。如果数据库架构发生改变,只要更新AdventureWorks.xsd文件,我们就会发现所有相关的改变在编译时自动完成了。

Other Techniques for Generating Strongly-Typed Data-Access Applications

  除了使用强类型数据集之处,还有其它的方法可以在你的程序中实现强类型。你可以创建比DataSets更轻量级并且更符合你数据库的自定义类。也有一些第三方软件开发者开发了自动完成这一过程的工具。其中一个比较特别的也是我比较喜爱的是LLBLGen Pro,我曾经写过关于它的一本书:Rapid C# Windows Development: Visual Studio 2005, SQL Server 2005, and LLBLGen Pro。(你可以在我的网站上免费阅读此书1/3的内容。)另一个很欢迎的工具是CodeSmith。甚至微软也在开发一个叫DLINQ的小工具,但仍在测试之中,估计至少要等一下年才会推出。
  如果你使用Visual Studio的强数据集方法,不容置疑,其中一个优点便是你不需要购买其它软件。所有的这些解决方案都有不同的特点和好处,但最主要的好处是可靠,错误少,花更少的时间调试。也更容易去检查数据库架构改变所造成的影响并作维护。希望你已经认识到强类型的好处。祝开发好运(约会也是)!

By Joseph Chancellor

Attachments

Download the code examined in this article
About the Author
Joseph Chancellor is a C# developer in Southern California who has had his fair share of relational trauma. He appreciates all kinds of feedback and suggestions. Visit his blog or read the first five chapters of his book on Visual Studio 2005, SQL Server 2005, and LLBLGen Pro.

时间: 2024-08-03 20:05:58

在Visual Studio 2005和ASP.NET 2.0中使用强类型数据存取的相关文章

在VS 2005和ASP.NET 2.0中处理CSS样式表

本文给读者一个所有基于母板页的网页自动获得样式表的技巧,就是由控件提供的对相对路径调整的支持.可以在母板页里使用这个东西来轻松地引用一个在整个项目里重用的.CSS 样式表文件,不管这个项目是相对于根目录的还是一个子应用. 推荐一个可在ASP.NET 2.0中利用的技巧是,当使用CSS时,使用母板页的功能给你的网站提供统一的UI,使用母板页在一个地方引用所有的样式表,这样,所有基于这个母板页的网页就会自动获得这些样式表. 可利用的一个技巧是由 <head runat="server"

VS2005和ASP.NET2.0中使用强类型数据

asp.net|数据 一. 简介 作为开发人员,当我们在学习新技术时,例子可能是我们最大的敌人.而教程往往设计得易于理解,但是同时,它们常常加固了懒惰,低效性,甚至于危险的编码习惯.再也没有比ADO.NET示例更能说明问题的了.在本文中,我们将准备分析一下强类型对象对于你的数据库开发的意义以及为什么在没有例子的情况下你应该在应用程序中尽量使用强类型对象. 具体地说,我们将分析怎样在Visual Studio 2005中创建和使用强类型DataSet.正如本文所探讨的,相对于其它可选的弱类型化的数

湖南IT人才网Aspx(Microsoft Visual Studio 2005 C#.Net)——V2.0.1025版

问题描述 看见很多朋友为了找一个人才网而到处奔波,今日本菜鸟就把我的一个人才网打包发给大家吧.希望能帮大家一把..系统名称:湖南IT人才网Aspx(MicrosoftVisualStudio2005C#.Net)--V2.0.1025版http://www.hnitjob.cn软件环境:数据库:MicrosoftSQLServer2000技术平台:IIS(InternetInformationServer5版本及以上版本):调试(开发)工具:MicrosoftVisualStudio.NET20

怀化人才网Aspx(Microsoft Visual Studio 2005 C#.Net)——V2.0.0791版

问题描述 本产品成熟后,将开发源代码供广大.NET爱好者学习使用.作者&开发:CSB系统名称:人才网Aspx(MicrosoftVisualStudio2005C#.Net)--V2.0.0791版软件环境:数据库:MicrosoftSQLServer2000技术平台:IIS(InternetInformationServer5版本及以上版本):调试(开发)工具:MicrosoftVisualStudio.NET2005:服务器操作系统:开发过程中使用WindowsXPProfessional操

Visual Studio 2005 集成开发环境

Visual Studio 2005 集成开发环境   作者:ChinaBang时间:2005-04-10Blog: blog.csdn.net/shuaihj                 摘要:IDE增强     内容: Microsoft Visual Studio 2005 包含许多对开发环境新的增强.创新和提高,其目的在于使 Visual  .NET 开发人员比以往更加高效.本章探讨其中的一些功能,并且阐述开发人员如何使用它们以更快.更准确地编写代码. 提示除其他对 IDE 的"改进

在ASP.NET 2.0中操作数据之七十一:保护连接字符串及其它设置信息_自学过程

导言: ASP.NET应用程序的设置信息通常都存储在一个名为Web.config的XML文件里.在教程的前面部分我们已经好几次修改过Web.config文件了.比如在第一章,我们创建名为Northwind的数据集时,数据库连接字符串信息自动的添加到Web.config文件的<connectionStrings>节点.再后来,在第3章里,我们手动更新了Web.config文件,添加了一个<pages>元素,对所有的ASP.NET页面运用DataWebControls主题. 由于Web

体验ASP.NET 2.0 中的数据访问控件

asp.net|访问|控件|数据 简介 数据访问一直是开发 Web 应用程序的一个关键问题.几乎每个商业应用程序都需要数据驱动的 Web 页面.由于数据访问如此普遍,开发人员不断地为简单的数据库任务重新生成复杂的代码就显得毫无意义了.开发人员需要从格式各异的不同数据源中快速访问数据.幸运的是,ASP.NET 2.0 中新增的数据访问控件和 ADO.NET 2.0 解决了这一问题. 对于传统的 ASP 和 ASP.NET 1.1 应用程序而言,开发人员不得不创建代码访问和更新数据库,将检索到的数据

在ASP.NET 2.0中实现数据的绑定

ASP.NET的第一个版本就已经建立了一组新的数据库绑定控件.有了这些控件 的支持,数据的可视化和编辑就简单多了,其中一个最重要的控件就是DataGrid 控件.但是这个控件也有很多缺点.它为数据的排序,分页和编辑提供了一些内 置的功能,但必须手动实现. 而ASP.NET 2.0中采用了一种新的方式来解决以前版本的诸多问题, 并且提供了标准的功能.现在可以对任何数据源进行排序,分页和编辑----在大 多数情况下不需要输入任何代码.由于几乎所有的动态WEB程序都要考虑到与数据库的交互,幸运的是在A

asp.net夜话之四:Visual Studio 2005中容易被忽略的技巧

在今天我主要要介绍的有如下知识点: Visual Studio 2005网站开发环境 任务管理器 配置外部工具 代码段管理器 发布网站 之所以要单独用一篇文章来介绍Visual Studio 2005这个集成开发环境,是因为在做企业培训的时候,发现很多程序员仅仅用了一些基本功能,这个好像也符合软件界一个"20%和80%法则",就是80%的用户只用到了软件的20%的功能.确实有时候利用基本功能就足以进行开发了,但是有些功能能够方便我们的开发,有些能提高我们的开发速度,所以我觉得这些计较值