在ASP.NET 2.0中操作数据之六十七:在TableAdapters中(2)

  默认情况下,TableAdapter在主查询的基础上自动地创建INSERT, UPDATE, 以及DELETE statements.如果你点击“Advanced”按钮的话,你将看到该功能是激活的.不理会这些设置的话,TableAdapter将不能创建INSERT, UPDATE,以及DELETE statements因为主查询包含了JOIN.

/uploads/allimg/200612/1HJ1Qc_0.png


图2:键入一个包含JOIN的主查询

  点Finish完成向导。此时在DataSet设计器里将只包含一个TableAdapter,其包含的DataTable列出了SELECT查询返回的列.包括CategoryName 和 SupplierName,如图3所示.

/uploads/allimg/200612/1HJ15464_0.png


图3:DataTable包含了返回的列

  此外,TableAdapter的InsertCommand, UpdateCommand, 和DeleteCommand属性为空。你可以在设计器里选中TableAdapter,查看属性窗口.你将看到InsertCommand, UpdateCommand, 和DeleteCommand属性设置为“(None)”.

/uploads/allimg/200612/1HJ5JX_0.png


图4: InsertCommand, UpdateCommand,DeleteCommand属性为“(None)”

  为了验证该缺点,我们可以通过属性窗口为InsertCommand, UpdateCommand,以及 DeleteCommand属性手动写入SQL statements以及参数.最开始我们可以设置TableAdapter的主查询不包含任何JOIN,这将允许自动生成INSERT, UPDATE,以及DELETE statements.完成向导设置后,我们可以通过属性窗口手动修改TableAdapter的SelectCommand以包含JOIN语法.

  虽然这种方法工作正常,但很脆弱.因为我们可以在任何时候通过向导设置重新设置主查询,重新自动生成INSERT, UPDATE,以及DELETE statements.这意味着我们刚刚进行的用户定制可以很容易地就被丢失了.

  好在TableAdapter自动生成的INSERT, UPDATE,以及DELETE statements的脆弱性仅仅针对ad-hoc SQL statements而言.如果你的TableAdapter使用的是存储过程的话,你可以自定义SelectCommand, InsertCommand, UpdateCommand,或DeleteCommand存储过程.重新运行TableAdapter设置向导时不用担心存储过程会被修改.

  在接下来的几个步骤里我们将创建一个TableAdapter,最初我们使用一个不含JOIN的主查询,以便自动生成相应的insert, update,和delete存储过程.接着,我们将更新该SelectCommand以使用JOIN来从相关表返回额外的列. 最后,我们将创建一个对应的Business Logic Layer class类,在ASP.NET页面上使用该TableAdapter.

第1步:使用简单的主查询创建一个TableAdapter

  在本文,我们将为NorthwindWithSprocs DataSet数据集的Employees表添加一个TableAdapter以及一个强类型的DataTable.该Employees表包含一个ReportsTo列,它指定了该雇员的经理的EmployeeID值.比如:雇员Anne Dodsworth的ReportTo值为5,也就是Steven Buchanan的EmployeeID值.因此,雇员Anne Dodsworth的经理就是Steven Buchanan.除了返回每个雇员的ReportsTo值外,我们也想返回他们经理的名字.为此,我们可以使用JOIN.但是我们知道,在最初创建TableAdapter时使用JOIN的话向导将不能够自动生成相应的insert, update,delete属性. 因此,我们在最初创建 TableAdapter的时候不在其主查询里包含任何的JOIN.在第2步里,我们将对主查询存储过程进行更新,通过使用JOIN来获取经理的名字.

  我们打开~/App_Code/DAL文件夹里的NorthwindWithSprocs DataSet数据集.在设计器里单击右键,选择“Add”项,再选" TableAdapter",这将打开TableAdapter设置向导.如图5所示,让向导创建一个新的存储过程,再点Next.具体的相关细节请参阅第65章《在TableAdapters中创建新的存储过程

/uploads/allimg/200612/1HJ22104_0.png


图5:选择“Create new stored procedures”项

该TableAdapter的主查询的SELECT statement如下:

SELECT EmployeeID, LastName, FirstName, Title, HireDate, ReportsTo, Country FROM Employees

  由于该查询没有包含任何的JOIN,因此TableAdapter向导将用相应的INSERT, UPDATE, DELETE statements来创建存储过程.

  接下来向导要我们为存储过程命名。用Employees_Select, Employees_Insert, Employees_Update, and Employees_Delete来命名,如图6所示。

/uploads/allimg/200612/1HJ25212_0.png


图6:对TableAdapter的存储过程命名

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjwyws.html