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

  我们希望可以删除任何一个category,不管其是否有对应的产品.当删除category时,我们同样希望删除其对应的产品(尽管我们可以简单的将这些产品的CategoryID值设置为NULL).为此,我们可以创建一个存储过程,它接受一个输入参数@CategoryID。当调用它时明确的将所有对应的product删除,然后再将这个category删掉.

人们的第一反应是创建类似下面的存储过程:

CREATE PROCEDURE dbo.Categories_Delete ( @CategoryID int ) AS -- First, delete the associated products... DELETE FROM Products WHERE CategoryID = @CategoryID -- Now delete the category DELETE FROM Categories WHERE CategoryID = @CategoryID

  上述代码明白无误的将相关的product以及该category删除,只是没有置身于一个事务内.假设还有其它的基于Categorie表CategoryID值的外键约束,那么在这种情况下问题就出来了:对该category来说,其相关的product都删除掉了,而这个category因与其它表还有外键约束而仍然保留在数据库.

  如果该存储过程置身于一个事务里的话,对Categories表的删除操作失败将导致对Products表的删除操作回滚.下面的存储过程脚本使用一个事务来确保对这2个DELETE statement的原子操作:

CREATE PROCEDURE dbo.Categories_Delete ( @CategoryID int ) AS BEGIN TRY BEGIN TRANSACTION -- Start the transaction -- First, delete the associated products... DELETE FROM Products WHERE CategoryID = @CategoryID -- Now delete the category DELETE FROM Categories WHERE CategoryID = @CategoryID -- If we reach here, success! COMMIT TRANSACTION END TRY BEGIN CATCH -- Whoops, there was an error ROLLBACK TRANSACTION -- Raise an error with the -- details of the exception DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int SELECT @ErrMsg = ERROR_MESSAGE(), @ErrSeverity = ERROR_SEVERITY() RAISERROR(@ErrMsg, @ErrSeverity, 1) END CATCH

花点时间向Northwind数据库添加一个名为Categories_Delete的存储过程,具体步骤可参考第一步.

第六步:更新CategoriesTableAdapter

  一旦我们添加完Categories_Delete存储过程后,DAL层就可以使用ad-hoc SQL statements来执行删除操作了.不过我们需要更新CategoriesTableAdapter,使其使用Categories_Delete存储过程.

  注意:在前几章我们处理的是NorthwindWithSprocs数据集,该数据集只有一个实体——ProductsDataTable,但是我们将会遇到处理categories的情况。因此,在本文后面部分,当我提到数据访问层(Data Access Layer)时,我指的是Northwind数据集,也就是我们在第1章《创建一个数据访问层》里创建的那个.

  打开Northwind数据集,选中CategoriesTableAdapter并打开其属性窗口,该窗口列出了该TableAdapter用到的InsertCommand, UpdateCommand, DeleteCommand, 以及SelectCommand,以及name和数据库连接信息.展开DeleteCommand属性查看其细节.如图15所示,DeleteCommand的ComamndType属性被设置为Text, 其文本信息作为一个ad-hoc SQL查询.

/uploads/allimg/200612/1HP1F55_0.png


图15:在CategoriesTableAdapter的属性窗口查看其属性信息

  让我们来作一些修改.选中“(DeleteCommand)”文本,然后在下拉列表里选“(New)”,这将清除掉CommandText, CommandType,Parameters属性的设置。接着将CommandType属性设置为StoredProcedure,然后在CommandText属性里输入存储过程的名称(即dbo.Categories_Delete).如果你是按照先设置CommandType属性再设置CommandText属性的顺序的话,Visual Studio将自动生成Parameters collection(参数集).如果你没有按照这个顺序来的话,你就只能点击Parameters属性里的一个椭圆型的区域来打开Parameters Collection Editor对话框,手动添加参数.不管是自动的还是手动添加参数,我们都应该打开Parameters Collection Editor对话框以检查参数是否正确(如图16).如果你在对话框里没看到任何的参数,那么就手动添加参数@CategoryID,(你不需要添加参数@RETURN_VALUE).

/uploads/allimg/200612/1HP5S25_0.png


图16:确保参数设置正确

  当DAL完成更新后,删除一个category将自动的删除所有其对应的product,这些操作都置身于一个事务里.我们来做个验证,重返刚才那个页面,当单击某个category的Delete按钮时,该category及其所有的product都会被删除.

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

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