图11:该EmployeesDataTable现在包含了2个新列
为了验证更新后的Employees_Select存储过程是否起作用,以及该TableAdapter的insert, update,delete功能,我们要创建一个web页面来允许用户查看并删除employees.不过在此之前,我们要先在业务逻辑层里创建一个新类来处理NorthwindWithSprocs DataSet数据集里的employees.在第4步,我们将创建一个EmployeesBLLWithSprocs class类,在第5步,我们将在一个ASP.NET页面里使用该类.
第4步:更新Business Logic Layer
在~/App_Code/BLL文件夹里创建一个名为EmployeesBLLWithSprocs.cs的类文件.该类文件与现有的EmployeesBLL class类文件差不多,只是方法要少一些,且使用的是NorthwindWithSprocs DataSet数据集(而不是Northwind DataSet数据集)。在EmployeesBLLWithSprocs类里添加如下的代码:
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using NorthwindWithSprocsTableAdapters; [System.ComponentModel.DataObject] public class EmployeesBLLWithSprocs { private EmployeesTableAdapter _employeesAdapter = null; protected EmployeesTableAdapter Adapter { get { if (_employeesAdapter == null) _employeesAdapter = new EmployeesTableAdapter(); return _employeesAdapter; } } [System.ComponentModel.DataObjectMethodAttribute (System.ComponentModel.DataObjectMethodType.Select, true)] public NorthwindWithSprocs.EmployeesDataTable GetEmployees() { return Adapter.GetEmployees(); } [System.ComponentModel.DataObjectMethodAttribute (System.ComponentModel.DataObjectMethodType.Delete, true)] public bool DeleteEmployee(int employeeID) { int rowsAffected = Adapter.Delete(employeeID); // Return true if precisely one row was deleted, otherwise false return rowsAffected == 1; } }
该EmployeesBLLWithSprocs class类的Adapter属性返回NorthwindWithSprocs DataSet数据集的EmployeesTableAdapter的一个实例,类里面的GetEmployees 和DeleteEmployee方法将要用到该属性.其中,GetEmployees方法调用EmployeesTableAdapter对应的GetEmploye方法,其又再调用Employees_Select存储过程并将结果传递给一个EmployeeDataTable;而DeleteEmployee方法仅仅调用EmployeesTableAdapter的Delete方法,该Delete方法调用Employees_Delete存储过程.
第5步:在表现层处理数据
添加完EmployeesBLLWithSprocs class类后,我们将在一个ASP.NET页面里处理 employee数据。打开AdvancedDAL文件夹里的JOINs.aspx页面,从工具箱里拖一个GridView控件到页面,设其ID值为Employees.接下来,从其智能标签里绑定到一个名为EmployeesDataSource的新的ObjectDataSource控件.设置该ObjectDataSource控件使用EmployeesBLLWithSprocs class类,在SELECT 和 DELETE标签里分别选择GetEmployees 和 DeleteEmployee方法. 点Finish完成设置.
图12:设置该ObjectDataSource使用EmployeesBLLWithSprocs Class类
图13:设置该ObjectDataSource调用GetEmployees 和 DeleteEmployee方法
Visual Studio会为EmployeesDataTable里的每列添加一个BoundField。将Title, LastName, FirstName, ManagerFirstName,和ManagerLastName之外的列全部删除。并分别将这几个列的HeaderText属性重命名为“Last Name”, “First Name”, “Manager's First Name”, “Manager's Last Name” .
为了让用户可以在页面删除employees,我们要做2件事情.首先启用GridView的删除功能,然后将ObjectDataSource控件的OldValuesParameterFormatString属性设置为默认值{0}。完成这些后,GridView 和 ObjectDataSource控件的声明代码看起来应该和下面的差不多:
<asp:GridView runat="server" AutoGenerateColumns="False" DataKeyNames="EmployeeID" DataSourceID="EmployeesDataSource"> <Columns> <asp:CommandField ShowDeleteButton="True" /> <asp:BoundField DataField="Title" HeaderText="Title" SortExpression="Title" /> <asp:BoundField DataField="LastName" HeaderText="Last Name" SortExpression="LastName" /> <asp:BoundField DataField="FirstName" HeaderText="First Name" SortExpression="FirstName" /> <asp:BoundField DataField="ManagerFirstName" HeaderText="Manager's First Name" SortExpression="ManagerFirstName" /> <asp:BoundField DataField="ManagerLastName" HeaderText="Manager's Last Name" SortExpression="ManagerLastName" /> </Columns> </asp:GridView> <asp:ObjectDataSource runat="server" DeleteMethod="DeleteEmployee" OldValuesParameterFormatString="{0}" SelectMethod="GetEmployees" TypeName="EmployeesBLLWithSprocs"> <DeleteParameters> <asp:Parameter Type="Int32" /> </DeleteParameters> </asp:ObjectDataSource>
在浏览器里测试该页面,如图14所示,该页面列出了每一个employee以及他们的经理的名字.