当向类型化的数据集(Typed DataSet)添加一个TableAdapter时,相应的DataTable的构架已经由TableAdapter的主查询定义好了.比如,如果主查询返回A, B,C这3个域,那么 DataTable将有对应的3个列A, B,和C.除了主查询以外,TableAdapter还可以包含其他的查询,可能是返回基于某些参数的数据。比如,ProductsTableAdapter的主查询返回所有产品的信息,此外,ProductsTableAdapter还包含诸如GetProductsByCategoryID(categoryID) 和 GetProductByProductID(productID)的方法,它们根据指派的参数返回特定的产品信息.
如果TableAdapter的方法返回的列涵盖在主查询里,工作起来没有问题。但如果返回的列并没有涵盖在主查询,那么我们就需要对DataTable的构架进行扩充.在第35章《使用Repeater和DataList单页面实现主/从报表》里,我们向CategoriesTableAdapter添加方法以返回 CategoryID, CategoryName, Description和NumberOfProducts列。其中前3列是涵盖在主查询里的,而NumberOfProducts列没有在主查询里定义,它返回的是每个category相关产品的数目.我们可以向CategoriesDataTable手工添加一列,以便于统计从新方法返回的NumberOfProducts列的值.
在第52章《使用FileUpload上传文件》我们探讨过,对使用ad-hoc SQL statements构建且其方法返回的列超出主查询范围的TableAdapters必须多加留意.因为一旦重新运行设置向导的话,它将对TableAdapter的方法进行更新,使其返回的列与主查询相匹配.不过如果使用存储过程的话就不会出现这种情况.
在本文我们将考察如何扩展DataTable的构架以包含额外的列。我们都知道使用ad-hoc SQL statements构架的TableAdapter不稳定,本文我们将用存储过程来构架.你可以参考第65章《在TableAdapters中创建新的存储过程》和第66章《在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新添一列
这将向DataTable新添一列,名为“Column1”,类型为System.String.我们需要将该列的名称改为“PriceQuartile”,类型改为System.Int32,因为它的值介于1到4之间.在ProductsDataTable 选中我们新添加的列,在属性窗口里设置其Name属性为 “PriceQuartile”,DataType属性为System.Int32.
图2:设置该新列的Name 和 DataType属性
就像图2所示,我们还可以设置其它的属性.比如,是否该列的值必须为unique;如果该列为自增列,其值是否允许为NULL等等.不过我们这里使用其默认值.
第二步:创建GetProductsWithPriceQuartile方法
现在我们已经对ProductsDataTable进行了更新以包含PriceQuartile列,我们将要创建一个GetProductsWithPriceQuartile方法.在TableAdapter上单击右键,再选择“Add Query”.这将开启TableAdapter查询设置向导,它首先询问我们是使用ad-hoc SQL statements还是使用现有的存储过程或新建一个存储过程.我们选择“Create new stored procedure”,再点Next.