ASP.NET 2.0数据教程之七十:为DataTable添加额外的列2010-08-13 翻译:CSDN 王文涛返回“”导言:当向类型化的数据集(Typed DataSet)添加一个TableAdapter时 ,相应的DataTable的构架已经由TableAdapter的主查询定义好了.比如,如果主 查询返回A, B,C这3个域,那么 DataTable将有对应的3个列A, B,和C.除了主查询 以外,TableAdapter还可以包含其他的查询,可能是返回基于某些参数的数据。 比如,ProductsTableAdapter的主查询返回所有产品的信息,此外, ProductsTableAdapter还包含诸如GetProductsByCategoryID(categoryID) 和 GetProductByProductID(productID)的方法,它们根据指派的参数返回特定的产 品信息.如果TableAdapter的方法返回的列涵盖在主查询里,工作起来没 有问题。但如果返回的列并没有涵盖在主查询,那么我们就需要对DataTable的构 架进行扩充.在第35章《Master/Detail Using a Bulleted List of Master Records with a Details DataList》里,我们向CategoriesTableAdapter添加方 法以返回 CategoryID, CategoryName, Description和NumberOfProducts列。其 中前3列是涵盖在主查询里的,而NumberOfProducts列没有在主查询里定义,它返 回的是每个category相关产品的数目.我们可以向CategoriesDataTable手工添加 一列,以便于统计从新方法返回的NumberOfProducts列的值.在第54章 《Uploading Files》我们探讨过,对使用ad-hoc SQL statements构建且其方法 返回的列超出主查询范围的TableAdapters必须多加留意.因为一旦重新运行设置 向导的话,它将对TableAdapter的方法进行更新,使其返回的列与主查询相匹配. 不过如果使用存储过程的话就不会出现这种情况.在本文我们将考察如何 扩展DataTable的构架以包含额外的列。我们都知道使用ad-hoc SQL statements 构架的TableAdapter不稳定,本文我们将用存储过程来构架.你可以参考第67章《 the Creating New Stored Procedures for the Typed DataSet’s TableAdapters》和第68章《Using Existing Stored Procedures for the Typed DataSet’s TableAdapters》来获取设置TableAdapter使用存储过程的更多 信息.第一步:向ProductsDataTable添加一个PriceQuartile列在 第67章里我们创建了一个名为NorthwindWithSprocs的类型化的数据集.该数据集 目前包含2个DataTables:ProductsDataTable以及 EmployeesDataTable。其中ProductsTableAdapter包含3个方法:.GetProducts——主查询,返回Products表的所有记录.GetProductsByCategoryID(categoryID)——根据指定的 categoryID值返回所有产品.GetProductByProductID(productID) ——根据指定的productID值返回所有的产品主查询及另外2个 方法都返回相同的数据列,也就是Products表的所有列,并没有返回Categories 以及Suppliers表的相关数据.在本文,我们将向ProductsTableAdapter添 加一个名为GetProductsWithPriceQuartile 的方法,它返回所有的产品.除了标 准的数据列外,它还返回PriceQuartile列,它用四分位数来衡量产品价格下跌程 度.如果产品价格上升了25%,那么其值为1,如果下降为25%,那么其值为4.在我 们创建一个存储过程来返回这种信息之前,我们首先需要更新ProductsDataTable ,新添一列来包含GetProductsWithPriceQuartile方法返回的 PriceQuartile 值.打开NorthwindWithSprocs数据集,在ProductsDataTable上右键单击 ,选择“ Add” ,再选择“Column”.

图1:向ProductsDataTable新添一列