在ASP.NET2.0中操作数据之六十六:在TableAdapters中使用现有的存储过程作者:heker2007字体:[增加减小]类型:转载时间:2016-05-19我要评论虽然通过TableAdapter向导可以自动的生成存储过程,但是在某些时候我们需要使用现有的存储过程。本文将讲解如何在VisualStudio环境里手动添加存储过程,并引导TableAdapter的方法使用这些存储过程。导言:在前面的文章里我们考察了如何让TableAdapters向导自动的创建存储过程.而在本文,我们将考察如何让TableAdapter使用现有的存储过程。由于Northwind数据库现有的存储过程很少,我们也需要考察如何在VisualStudio环境里手动向数据库添加新的存储过程.注意:在第61章《在事务里对数据库修改进行封装》里我们向TableAdapter添加了一些方法以支持事务(比如(BeginTransaction,CommitTransaction等)。我们可以在不修改数据访问层代码的情况下,在一个存储过程里管理整个事务.在本文,我们还将对事务里执行存储过程的T-SQLcommands命令进行考察.第一步:向Northwind数据库添加存储过程我们很容易通过VisualStudio向数据库添加存储过程.让我们向Northwind数据库添加一个新存储过程,它返回Products表里特定CategoryID值的产品.在服务器资源管理窗口,展开Northwind数据库,就像我们在前面的文章看到的一样,存储过程文件夹包含了现有的存储过程。要添加新的存储过程的话,只需要右键单击存储过程文件夹,选“添加新存储过程”项,图1:右击StoredProcedures文件夹选“AddaNewStoredProcedure”如图1所示,选“AddaNewStoredProcedure”项后,将在VisualStudio里打开一个脚本窗口.输入如下的脚本:?1234567891011CREATEPROCEDUREdbo.Products_SelectByCategoryID(@CategoryIDint)ASSELECTProductID,ProductName,SupplierID,CategoryID,QuantityPerUnit,UnitPrice,UnitsInStock,UnitsOnOrder,ReorderLevel,DiscontinuedFROMProductsWHERECategoryID=@CategoryID当执行该脚本时,将会向数据库添加一个名为Products_SelectByCategoryID的新存储过程,该存储过程接受一个输入参数(@CategoryID,类型为int)并将与CategoryID值匹配的所有产品返回.执行该CREATEPROCEDURE脚本,将向数据库添加存储过程,点工具栏的保存按钮或按Ctrl+S。如此之后,刷新存储过程文件夹以显示最近添加的存储过程,如此一ilai部分由“CREATEPROCEDUREdbo.Products_SelectProductByCategoryID”转变为“ALTERPROCEDUREdbo.Products_SelectProductByCategoryID”.CREATEPROCEDURE用于添加新存储过程,而ALTERPROCEDURE用于更新现有的存储过程。由于脚本开头部分已经转变为ALTERPROCEDURE,我们可以通过改动输入参数或SQLstatements并点击保存按钮,即可完成对存储过程的更新.图2显示的是保存Products_SelectByCategoryID存储过程后的画面.图2:Products_SelectByCategoryID存储过程已经添加到数据库第二步:设置TableAdapter使用现有的存储过程现在存储过程Products_SelectByCategoryID已经添加到数据库,我们将设置数据访问层使用该存储过程。具体说,我们将向ProductsTableAdapter添加GetProducstByCategoryID(categoryID)方法,该方法将调用我们刚刚创建的存储过程Products_SelectByCategoryID.打开NorthwindWithSprocs数据集,在ProductsTableAdapter上右键单击,选“添加查询”以启用TableAdapterQueryConfigurationwizard.我们将使用刚刚创建的存储过程Products_SelectByCategoryID,因此选“Useexistingstoredprocedure”项,然后点Next.图3:选“Useexistingstoredprocedure”项接下来的画面为一个下拉列表框,列出了数据库现有的所有存储过程,当选择某个存储过程的话,左边将列出其输入参数,右边将列出其返回列(如果有的话).在下拉列表里选Products_SelectByCategoryID存储过程,再点Next.图4:选Products_SelectByCategoryID存储过程.接下来的画面询问我们存储过程返回的是哪种类型的数据,以及TableAdapter的方法返回的类型.比如,如果我们指定返回tabulardata(表列数据)的话,该方法将返回一个ProductsDataTableinstance实例;如果我们指定存储过程返回一个单一值(asinglevalue)的话,TableAdapter将返回一个object(对象),该对象由存储过程返回的第一行的第一列来赋值.由于存储过程Products_SelectByCategoryID将返回某个category的所有产品,选第一项“Tabulardata”,再点Next.图5:指定存储过程返回TabularData然后需要指定采用的方法模式以及方法的名称.同时选中FillaDataTable”和“ReturnaDataTable”项.将这2个方法重命名为FillByCategoryID和GetProductsByCategoryID.点Next,确认无误的话,再点Finish完成设置。图6:将方法命名为FillByCategoryID和GetProductsByCategoryID注意:我们刚才添加FillByCategoryID和GetProductsByCategoryID方法,执行一个int类型的输入参数,它由@CategoryID传递进来。如果你要改动Products_SelectByCategory存储过程的参数的话,你也必须更新这些TableAdapter方法的参数.就像在前一篇文章探讨的一样,要么手动添加或删除参数集里的参数,要么再次运行TableAdapter向导.第三步:在BLL层添加一个GetProductsByCategoryID(categoryID)方法设置完DAL层的GetProductsByCategoryID方法后,下一步我们将在业务逻辑层添加方法以调用该方法.打开ProductsBLLWithSprocsclass类的文件,添加如下方法:?1234567[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select,false)]publicNorthwindWithSprocs.ProductsDataTableGetProductByCategoryID(intcategoryID){returnAdapter.GetProductsByCategoryID(categoryID);}该BLL层方法仅仅通过ProductsTableAdapter的GetProductsByCategoryID()方法来返回ProductsDataTable。由于使用了DataObjectMethodAttribute属性,我们使用ObjectDataSource的设置数据源向导时,该方法会出现在SELECT标签的下拉列表中.第四步:展示产品为测试新添加的Products_SelectByCategoryID存储过程,以及DAL和BLL层里的对应的方法,我们将创建一个ASP.NET页面,该页面包含一个DropDownList控件以及一个GridView控件.DropDownList控件列出数据库里所有的category,当选定某个category时,我们将在GridView里将属于该category的所有product展示出来.注意:我们在前面的文章里用DropDownList控件创建过主/从报表,更多细节请参考第7章《使用DropDownList过滤的主/从报表》打开AdvancedDAL文件夹里的ExistingSprocs.aspx页面,从工具箱里拖一个DropDownList控件到页面,设置其ID为Categories,AutoPostBack属性为true.接下来,在其智能标签里将其绑定到一个名为CategoriesDataSource的ObjectDataSource控件.设置该控件调用CategoriesBLLclass类的GetCategories方法,而在UPDATE,INSERT,以及DELETE标签里选“(None)”.图7:调用CategoriesBLLClass类的GetCategories方法图8:在UPDATE,INSERT,和DELETE标签里选“(None)”完成ObjectDataSource向导后,我们设置DropDownList控件显示的是CategoryName列,而传递的Value值为CategoryID列.此时,DropDownList控件和ObjectDataSource控件的声明代码看起来和下面的差不多:?123456789asp:DropDownListID=Categoriesrunat=serverAutoPostBack=TrueDataSourceID=CategoriesDataSourceDataTextField=CategoryNameDataValueField=CategoryID/asp:DropDownListasp:ObjectDataSourceID=CategoriesDataSourcerunat=serverOldValuesParameterFormatString=original_{0}SelectMethod=GetCategoriesTypeName=CategoriesBLL/asp:ObjectDataSource接下来,在DropDownList控件下面放一个GridView控件,社其ID为ProductsByCategory,并将其绑定到一个名为ProductsByCategoryDataSource的ObjectDataSource控件,该控件调用ProductsBLLWithSprocsclass类的GetProductsByCategoryID(categoryID)方法。由于该GridView控件仅仅用来展示数据,因此,在UPDATE,INSERT,和DELETE标签里选“(None)”并点Next.图9:设置ObjectDataSource控件ProductsBLLWithSprocsClass类图10:调用GetProductsByCategoryID(categoryID)方法接下来要选择参数来源,我们在Parametersource下拉列表里选“Control”;在ControlID下拉列表里选“Categories”。点Finish完成设置.图11:设参数categoryID来源于ID为Categories的DropDownList控件完成ObjectDataSource向导后,VisualStu