加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

在ASP.NET 2.0中操作数据之六十六:在TableAdapters中使用现有的

发布时间:2016-11-24 08:26:35 所属栏目:MsSql教程 来源:站长网
导读:导言: 在前面的文章里我们考察了如何让TableAdapters向导自动的创建存储过程.而在本文,我们将考察如何让TableAdapter使用现有的存储过程。由于Northwind数据库现有的存储过程很少,我们也需要考察如何在Visual Studio环境里手动向数据库添加新的存储过程

  如果执行无误,COMMIT TRANSACTION将提交更改并完成事务;如果执行出错,那么CATCH区域的ROLLBACK TRANSACTION将数据库返回到开始前的状态。存储过程也会通过RAISERROR command命令抛出一个SqlException异常.
注意:上面代码的的TRY...CATCH模式是SQL Server 2005里新添加的,如果你使用的是Microsoft SQL Server稍微旧点的版本的话,上面的代码不会成功执行。不过你可以参考这篇文章《Managing Transactions in SQL Server Stored Procedures》(http://www.4guysfromrolla.com/webtech/080305-1.shtml)以寻求帮助.

  让我们看一个实实在在的例子。在Categories表和Products表之间有一个外键约束,这意味着,Products表里的CategoryID列必须要与Categories表里的CategoryID值吻合.如果某个category有对应的product,而我们试图删除该category时将会导致违背外键约束.我们来进行演示,登录这个页面(~/BinaryData/UpdatingAndDeleting.aspx),该页面列出了系统里的所有category,且每行都包含Edit和Delete按钮(如图13),如果你尝试删除一个有对应product的category时,比如Beverages——删除失败,因为违背了外键约束(如图14所示).

/uploads/allimg/c161121/14OI9541A560-12S021.png
图13:每条Category记录都包含Edit 和 Delete按钮

/uploads/allimg/c161121/14OI9541ZU0-1295T1.png
图14:你无法删除有对应产品的Category

  我们希望可以删除任何一个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/c161121/14OI9542100P-1302636.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/c161121/14OI954233940-131N11.png
图16:确保参数设置正确

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读