图14:Employees_Select存储过程使用JOIN返回经理的名字
点击Delete按钮将触发deleting流程,直到执行Employees_Delete存储过程才结束,但是存储过程里的DELETE statement执行失败,原因是有外键约束(如图15所示)。因为每个employee在Orders表里都有一条到多条记录,才导致删除操作失败.
图15:删除操作违背外键约束
如果要删除操作执行成功,你要:
.更新外键约束
.对你要删除的employee(s),在Orders表里删除对应的记录
.更新Employees_Delete存储过程,使其在删除Employees记录之前,先删除Orders表里对应的记录.我们在第66章《在TableAdapters中使用现有的存储过程》里探讨过这个问题.
我将此作为练习留给读者
总结:
当处理关系型数据库时,我们通常要从多个不同的但又相关的表获取数据。Correlated subqueries 和 JOIN提供了两种从关系表访问数据的方法.在以前的文章里使用的是correlated subqueries,因为如果使用JOIN的话TableAdapter将不能自动生成INSERT, UPDATE,DELETE statements,不过我们可以通过手工添加.如果使用ad-hoc SQL statements的话,任何用户定制都可能被TableAdapter设置向导所做的改动所覆盖.
幸运的是,用存储过程构建的TableAdapters不像用ad-hoc SQL statements构建的TableAdapters那样易受影响.因此,当用存储过程构建TableAdapter时,在主查询里使用JOIN是可行的.在本文,我们考察了如何创建这种TableAdapter.最开始我们在TableAdapter的主查询里使用不带JOIN的SELECT查询,以便自动生成相应的insert, update,delete存储过程. 然后我们对SelectCommand存储过程进行扩充以使用一个JOIN,并重新运行TableAdapter设置向导来更新EmployeesDataTable的列.
重新运行TableAdapter设置向导将自动更新EmployeesDataTable的列以映射Employees_Select存储过程返回的列.当然我们也可以向DataTable手动添加这些列,这是我们下一章要考察的内容.
祝编程快乐!
作者简介
本系列教程作者 Scott Mitchell,著有六本ASP/ASP.NET方面的书,是4GuysFromRolla.com的创始人,自1998年以来一直应用 微软Web技术。大家可以点击查看全部教程《[翻译]Scott Mitchell 的ASP.NET 2.0数据教程》,希望对大家的学习ASP.NET有所帮助。
您可能感兴趣的文章: