版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、在ASP.NET 2.0中操作数据之六十八:为DataTable添加额外的列作者:heker2007 字体:增加减小 类型:转载 时间:2016-05-19我要评论本文介绍并使用TableAdapter向DataTable添加新的一列的方法和步骤,任何时候只要重新运行TableAdapter设置向导,用户所做的所有定制都要被覆盖,为避免出现这种情况,我们建议直接修改存储过程。导言:当向类型化的数据集(Typed DataSet)添加一个TableAdapter时,相应的DataTable的构架已经由TableAdapter的主查询定义好了.比如,如果主查询返回A, B,C这3个域,那么 Dat
2、aTable将有对应的3个列A, B,和C.除了主查询以外,TableAdapter还可以包含其他的查询,可能是返回基于某些参数的数据。比如,ProductsTableAdapter的主查询返回所有产品的信息,此外,ProductsTableAdapter还包含诸如GetProductsByCategoryID(categoryID) 和 GetProductByProductID(productID)的方法,它们根据指派的参数返回特定的产品信息.如果TableAdapter的方法返回的列涵盖在主查询里,工作起来没有问题。但如果返回的列并没有涵盖在主查询,那么我们就需要对DataTable的构
3、架进行扩充.在第35章使用Repeater和DataList单页面实现主/从报表里,我们向CategoriesTableAdapter添加方法以返回 CategoryID, CategoryName, Description和NumberOfProducts列。其中前3列是涵盖在主查询里的,而NumberOfProducts列没有在主查询里定义,它返回的是每个category相关产品的数目.我们可以向CategoriesDataTable手工添加一列,以便于统计从新方法返回的NumberOfProducts列的值.在第52章使用FileUpload上传文件我们探讨过,对使用ad-hoc SQL
4、 statements构建且其方法返回的列超出主查询范围的TableAdapters必须多加留意.因为一旦重新运行设置向导的话,它将对TableAdapter的方法进行更新,使其返回的列与主查询相匹配.不过如果使用存储过程的话就不会出现这种情况.在本文我们将考察如何扩展DataTable的构架以包含额外的列。我们都知道使用ad-hoc SQL statements构架的TableAdapter不稳定,本文我们将用存储过程来构架.你可以参考第65章在TableAdapters中创建新的存储过程和第66章在TableAdapters中使用现有的存储过程来获取设置TableAdapter使用存储过程
5、的更多信息.第一步:向ProductsDataTable添加一个PriceQuartile列在第67章里我们创建了一个名为NorthwindWithSprocs的类型化的数据集.该数据集目前包含2个DataTables:ProductsDataTable以及 EmployeesDataTable。其中ProductsTableAdapter包含3个方法:.GetProducts主查询,返回Products表的所有记录.GetProductsByCategoryID(categoryID)根据指定的categoryID值返回所有产品.GetProductByProductID(productID
6、)根据指定的productID值返回所有的产品主查询及另外2个方法都返回相同的数据列,也就是Products表的所有列,并没有返回Categories 以及Suppliers表的相关数据.在本文,我们将向ProductsTableAdapter添加一个名为GetProductsWithPriceQuartile 的方法,它返回所有的产品.除了标准的数据列外,它还返回PriceQuartile列,它用四分位数来衡量产品价格下跌程度.如果产品价格上升了25%,那么其值为1,如果下降为25%,那么其值为4.在我们创建一个存储过程来返回这种信息之前,我们首先需要更新ProductsDataTable,
7、新添一列来包含GetProductsWithPriceQuartile方法返回的 PriceQuartile值.打开NorthwindWithSprocs数据集,在ProductsDataTable上右键单击,选择“ Add” ,再选择“Column”.图1:向ProductsDataTable新添一列这将向DataTable新添一列,名为“Column1”,类型为System.String.我们需要将该列的名称改为“PriceQuartile”,类型改为System.Int32,因为它的值介于1到4之间.在ProductsDataTable 选中我们新添加的列,在属性窗口里设置其Name属性
8、为 “PriceQuartile”,DataType属性为System.Int32.图2:设置该新列的Name 和 DataType属性就像图2所示,我们还可以设置其它的属性.比如,是否该列的值必须为unique;如果该列为自增列,其值是否允许为NULL等等.不过我们这里使用其默认值.第二步:创建GetProductsWithPriceQuartile方法现在我们已经对ProductsDataTable进行了更新以包含PriceQuartile列,我们将要创建一个GetProductsWithPriceQuartile方法.在TableAdapter上单击右键,再选择“Add Query”.这
9、将开启TableAdapter查询设置向导,它首先询问我们是使用ad-hoc SQL statements还是使用现有的存储过程或新建一个存储过程.我们选择“Create new stored procedure”,再点Next.图3:在TableAdapter向导里创建新的存储过程接下来,如图4所示,向导询问我们添加的是那种类型的查询,由于GetProductsWithPriceQuartile方法将返回Products表的所有记录以及所有列,我们选择“SELECT which returns rows”项,再点Next.图4:查询将是一个返回多个行的SELECT Statement接下来,
10、我们在向导里键入如下的查询:?12345SELECT ProductID, ProductName, SupplierID, CategoryID,QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,ReorderLevel, Discontinued,NTILE(4) OVER (ORDER BY UnitPrice DESC) as PriceQuartileFROM Products上述查询使用了SQL Server 2005新增的NTILE function函数,它将结果划分为4组,将UnitPrice值按降序分组.不幸的是,查
11、询构造器(Query Builder)不能解析关键字OVER,并抛出一个错误信息。因此,直接在向导的文本框里键入上述代码,而不要使用查询构造器.注意:关于NTILE以及SQL Server 2005的其它函数的更多信息,你可参阅文章Returning Ranked Results with Microsoft SQL Server 2005(/webtech/-1.shtml)以及SQL Server 2005 Books Online的Ranking Functions section部分(http:/msdn2.microsoft.c
12、om/en-us/library/ms.aspx)完成后,点Next, 向导将要我们为新存储过程重命名,我们取名为Products_SelectWithPriceQuartile再点Next.图5:将新存储过程命名为Products_SelectWithPriceQuartile最后我们要为TableAdapter的方法命名,选中“Fill a DataTable” 和 “Return a DataTable”两项,并重命名为 FillWithPriceQuartile 和GetProductsWithPriceQuartile.图6:对TableAdapter的方法命名并点Finish当指定
13、了SELECT查询,并对存储过程和TableAdapter的方法命名后,点Finish完成向导。这时你将看到1到2条警告信息,说“The OVER SQL construct or statement is not supported.” 不必理会它.完成向导后,该TableAdapter将会包含FillWithPriceQuartile 和GetProductsWithPriceQuartile方法,并且数据库将包含一个名为Products_SelectWithPriceQuartile的存储过程。花点时间来验证一下,检查数据库,如果你没有看到我们刚添加的存储过程,在存储过程文件夹上右键单击
14、,选“刷新”.图7:验证新方法是否添加到TableAdapter图8:确保数据库包含Products_SelectWithPriceQuartile存储过程注意:使用存储过程来替换ad-hoc SQL statements的好处之一是重新运行TableAdapter设置向导的话并不会改动存储过程返回的列.我们可以作一个验证,在TableAdapter上右键单击,选“Configure”项,以启动向导,然后点Finish完成向导。接下来,我们在数据库里查看Products_SelectWithPriceQuartile存储过程.我们注意到其返回的列并没有发生变化.如果我们使用的是ad-hoc S
15、QL statements的话,重新运行向导将会使查询返回的列与主查询的列相匹配,因此它将把GetProductsWithPriceQuartile方法里使用的查询里的NTILE statement删除掉.当调用数据访问层的GetProductsWithPriceQuartile方法时,TableAdapter将执Products_SelectWithPriceQuartile存储过程,并为返回的每条记录向ProductsDataTable添加对应的row.存储过程返回的数据域(data fields)将映射到ProductsDataTable的列.因为该存储过程要返回一个PriceQuart
16、ile数据域,所以它的值将分配给ProductsDataTable的PriceQuartile列.对于那些不返回PriceQuartile数据域的方法而言,PriceQuartile列的值由其DefaultValue属性指定. 如图2所示,该默认值为DBNull。如果你想指定为其他值,仅仅改动DefaultValue属性即可,但一定要是一个有效的值(比如,PriceQuartile列的值一定要是一个System.Int32类型的值).现在我们完成了向DataTable添加额外列的必要的步骤,接下来我们要创建一个ASP.NET 页面来展示每个产品的 name, price,以及price qua
17、rtile.不过我们要先对业务逻辑层进行更新,以包含一个方法来调用数据访问层的GetProductsWithPriceQuartile方法.我们将在第3步更新业务逻辑层,在第4步创建一个ASP.NET页面.第三步:更新业务逻辑层我们在表现层调用新添加的GetProductsWithPriceQuartile方法以前,必须在业务逻辑层添加相应的方法,打开ProductsBLLWithSprocs class类文件,添加如下的代码:?123456System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObj
18、ectMethodType.Select, false)public NorthwindWithSprocs.ProductsDataTable GetProductsWithPriceQuartile()return Adapter.GetProductsWithPriceQuartile();就像其它方法一样,GetProductsWithPriceQuartile仅仅调用数据访问层对应的GetProductsWithPriceQuartile方法并返回其结果.第四步:在一个ASP.NET页面展示Price Quartile信息完成对业务逻辑层的修改后,我们将创建一个ASP.NET页面来显
19、示每个产品的price quartile信息.打开AdvancedDAL文件夹里的AddingColumns.aspx页面,从工具箱拖一个 GridView控件到页面,设置其ID为Products.在其智能标签里将其绑定到一个名为ProductsDataSource的新的ObjectDataSource控件,设置该控件调用ProductsBLLWithSprocs class类的GetProductsWithPriceQuartile方法,在UPDATE, INSERT,和DELETE标签里选“(None)”.图9:设置ObjectDataSource调用ProductsBLLWithSpro
20、cs类图10:调用GetProductsWithPriceQuartile方法获取产品信息完成设置向导后, Visual Studio会为GridView添加BoundField或CheckBoxField列,其中包括PriceQuartile列. 将ProductName, UnitPrice,PriceQuartile以外的列全部删除,设置UnitPrice列为货币格式.并将UnitPrice 和 PriceQuartile列放在右边,居中。 最后分别将这3列的HeaderText属性设置为“Product”, “Price”,“Price Quartile”。同时启用GridView控件
21、的排序功能.作上述修改后, GridView 和 ObjectDataSource控件的声明代码看起来和下面的差不多:?1234567891011121314151617181920212223如图11为在浏览器里登录该页面的情况,我们注意到,最开始产品按price的降序排列,同时每个产品都有相应的PriceQuartile值,当然这些数据也可以按其它标准来排序,如图12所示。图11:产品按Prices来排序图12:产品按名称来排序.注意:只需要很少的代码,我们就可以根据每行PriceQuartile值的不同而显示不同的颜色,比如对值为1的行显示为浅绿色,对值为2的行显示为浅黄色,以此类推.你
22、可以花点时间来实现该功能,如果有必要的话,你可以参阅第11章基于数据的自定义格式化另一种途径创建另一个TableAdapter正如我们在本文看到的,当向TableAdapter添加的方法返回的列超出了主查询范围的时候,我们可以向DataTable添加相应的列即可.对TableAdapter而言,如果当其包含的返回“额外列”的方法较少且“额外列”不是很多的时候,这种途径才能正常工作。除了往DataTable添加列以外,我们还可以对DataSet添加另外的TableAdapter,其包含的方法就是那些需要返回“额外列”的方法.就本问而言,我们可以向DataSet添加另一个名为ProductsWithPriceQuartileTableAdapter的TableAdapter,它将Products_SelectWithPriceQuartile存储过程作为它的主查询,对要获取price quartile信息的ASP.NET页面来说,只需调用 ProductsWithPriceQuartileTableAdapter即可;而不需要获取price quartile信息的页面只需要调用ProductsTableAdapter即可.这种另外新添加的TableAdapters可能导致某些功(functionality)、作业(task)重复.比如,如果那些展示Pric
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026深圳能源春季校园招聘备考题库含答案详解(基础题)
- 2026湖南省中南林业科技大学涉外学院人才招聘备考题库含完整答案详解(全优)
- 2026中国农业科学院油料作物研究所油料基因工程与转基因安全评价创新团队科研助理招聘1人备考题库及完整答案详解(名校卷)
- 2026广西玉林市福绵区就业中心招聘见习生1人备考题库附答案详解(突破训练)
- 中建一局西北公司2026届春季校园招聘备考题库有完整答案详解
- 2026上海虹口区卫健系统招聘38人备考题库含答案详解ab卷
- 2026福建泉州晋江市第三实验小学春季自聘合同教师招聘1人备考题库含完整答案详解【历年真题】
- 2026新疆第四师总医院春季招聘88人备考题库附参考答案详解【满分必刷】
- 2026上半年四川事业单位统考安州区考试招聘教师26人备考题库【重点】附答案详解
- 2026安徽黄山市屯溪区人民医院招聘编外紧缺人才备考题库附答案详解【巩固】
- 毕业设计(论文)-桶装纯净水自动灌装机的设计
- 城市轨道交通行车组织50课件
- 2025年江苏护理职业学院高职单招语文2019-2024历年真题考点试卷含答案解析
- 办公室用电安全分享
- 2025年度高速公路智能化监控系统建设合同3篇
- 化工泵技术要求
- 船舶内部审核-审核要素
- 2024年常州信息职业技术学院单招职业适应性测试题库及答案一套
- 贵州源鑫矿业有限公司煤矸石洗选综合利用项目环评报告
- 高中地理(湘教版2019版)必修二 全册知识点
- 1993年物理高考试卷与答案
评论
0/150
提交评论