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

/uploads/allimg/200612/1HP42F4_0.png


图10:调用GetProductsByCategoryID(categoryID)方法

接下来要选择参数来源,我们在Parameter source下拉列表里选“Control”;在ControlID下拉列表里选“Categories” 。点Finish完成设置.

/uploads/allimg/200612/1HP05942_0.png


图11:设参数categoryID来源于ID为Categories的DropDownList控件

完成ObjectDataSource向导后,Visual Studio会自动的添加BoundFields列和一个 CheckBoxField列。你可以对其外观尽情定制.

在浏览器里登录该页面,当登录时选取的是Beverages(饮料类),该类的产品将会显示出来.如果我们选择其它种类的话,对应的所有产品将显示出来.如下图: 

/uploads/allimg/200612/1HP01U7_0.png


图12: Produce类的所有产品都显示出来了

第五步:用事务封装存储过程命令

在第61章《在事务里对数据库修改进行封装》里我们探讨了用事务对数据库修改命令进行封装的技术,这些修改操作要么都成功要么都失败。使用事务的技术包括:

.使用System.Transactions命名空间里的类
.在Data Access Layer层调用ADO.NET classes类,比如SqlTransaction
.直接在存储过程里添加T-SQLtransaction commands事务命令

在63章我们在DAL层使用ADO.NET classe类,而在本文剩余部分,我们将在一个存储过程里运用T-SQL command命令来对一个事务进行管理.

用来手动启动、提交、回滚事务的3个主要SQL command命令分别是BEGIN TRANSACTION, COMMIT TRANSACTION, 以及ROLLBACK TRANSACTION.与使用ADO.NET方法类似,在一个存储过程里使用事务时,应采用如下的模式:

1.指出事务已经开启
2.执行事务包含的SQL statements
3.如果第二步的任何一个statement出错,则回滚事务
4.如果第二步的所有statement执行无误,则提交事务

可以用T-SQL syntax来执行该模式,如下:

BEGIN TRY BEGIN TRANSACTION -- Start the transaction ... Perform the SQL statements that makeup the transaction ... -- 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

  代码开始为一个TRY...CATCH模式——SQL Server2005新增的结构.就像C#里的try...catch模式一样,该SQL TRY...CATCH模式在TRY区域执行statement,如果任何一个statement出错,则立即转到CATCH区域.

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

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

/uploads/allimg/200612/1HP12W0_0.png


图13:每条Category记录都包含Edit 和 Delete按钮

/uploads/allimg/200612/1HP53260_0.png


图14:你无法删除有对应产品的Category

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

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