在ASP.NET 2.0中操作数据之六十一:在事务里对数据库修改进行封
|
打开ProductsBLL class类,添加一个名为UpdateWithTransaction的方法,该方法仅仅简单地调用对应的DAL方法.现在ProductsBLL类里有2个方法:UpdateWithTransaction方法——我们才添加的;以及DeleteProductsWithTransaction——我们在第三步添加的.
public int UpdateWithTransaction(Northwind.ProductsDataTable products)
{
return Adapter.UpdateWithTransaction(products);
}
public void DeleteProductsWithTransaction
(System.Collections.Generic.List<int> productIDs)
{
// Start the transaction
Adapter.BeginTransaction();
try
{
// Delete each product specified in the list
foreach (int productID in productIDs)
Adapter.Delete(productID);
// Commit the transaction
Adapter.CommitTransaction();
}
catch
{
// There was an error - rollback the transaction
Adapter.RollbackTransaction();
throw;
}
}
注意:根ProductsBLL类里的大部分方法不同,上述方法并不包含DataObjectMethodAttribute属性。这是因为我们将直接在ASP.NET页面的后台代码里调用这些方法,记得DataObjectMethodAttribute方法的作用是指出哪些方法应该出现在ObjectDataSource控件的设置数据源向导的某些标签(SELECT, UPDATE, INSERT, 或DELETE)里.由于GridView控件缺乏内置的支持“批编辑”或“批删除”的功能,我们将通过编辑的方式来调用这些方法. 第五步:在表现层更新数据库数据 为演示更新一批记录时事务的作用,我们将创建一个用户界面来将所有产品用一个GridView控件显示出来,并包含一个Button Web控件。当点击该按钮时为product重新赋值一个有效的CategoryID值。具体来说,对头几个products分配一个有效的CategoryID值;而剩下的分配一个无效的(non-existent)CategoryID值,当我们试图对这样的一个product——其CategoryID值与现有的category的CategoryID不匹配——进行更新时,将违反外键约束,进而抛出一个异常.在本文的示例里你将看到,在使用事务时,当违反外键约束抛出一个异常时将导致前面的正确分配CategoryID值的操作产生回滚.如果不使用事务的话,这些正确的操作将执行成功. 首先,打开BatchData文件夹里的Transactions.aspx页面,从工具箱拖一个GridView控件到页面。设置其ID为Products,从其智能标签里将其绑定到一个名为ProductsDataSource的ObjectDataSource控件,设置该控件调用ProductsBLL class类的GetProducts()方法。由于该GridView是“只读”的,在UPDATE, INSERT, 和DELETE标签里选“(None)”,点完成。
完成设置后,Visual Studio将自动的添加BoundFields以及一个CheckBoxField,删除ProductID, ProductName, CategoryID,和CategoryName以外的其它列;并且分别将ProductName 和 CategoryName列的HeaderText属性重命名为“Product” 和 “Category”.在智能标签里启用“分页”功能.做完这些修改后,GridView 和 ObjectDataSource控件的声明代码看起来应该和下面的差不多:
<asp:GridView ID="Products" runat="server" AllowPaging="True"
AutoGenerateColumns="False" DataKeyNames="ProductID"
DataSourceID="ProductsDataSource">
<Columns>
<asp:BoundField DataField="ProductID" HeaderText="ProductID"
InsertVisible="False" ReadOnly="True"
SortExpression="ProductID" />
<asp:BoundField DataField="ProductName" HeaderText="Product"
SortExpression="ProductName" />
<asp:BoundField DataField="CategoryID" HeaderText="CategoryID"
SortExpression="CategoryID" />
<asp:BoundField DataField="CategoryName" HeaderText="Category"
SortExpression="CategoryName" />
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ProductsDataSource" runat="server"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetProducts" TypeName="ProductsBLL">
</asp:ObjectDataSource>
然后,在GridView控件上添加3个Button Web控件,设置第一个按钮的Text属性 为“Refresh Grid”;第二个按钮的Text属性为“Modify Categories (WITH TRANSACTION)”;第三个按钮的Text属性为“Modify Categories (WITHOUT TRANSACTION)”.
<p> <asp:Button ID="RefreshGrid" runat="server" Text="Refresh Grid" /> </p> <p> <asp:Button ID="ModifyCategoriesWithTransaction" runat="server" Text="Modify Categories (WITH TRANSACTION)" /> </p> <p> <asp:Button ID="ModifyCategoriesWithoutTransaction" runat="server" Text="Modify Categories (WITHOUT TRANSACTION)" /> </p>
为这3个按钮的Click events事件创建事件处理器,如下:
protected void RefreshGrid_Click(object sender, EventArgs e)
{
Products.DataBind();
}
protected void ModifyCategoriesWithTransaction_Click(object sender, EventArgs e)
{
// Get the set of products
ProductsBLL productsAPI = new ProductsBLL();
Northwind.ProductsDataTable products = productsAPI.GetProducts();
// Update each product's CategoryID
foreach (Northwind.ProductsRow product in products)
{
product.CategoryID = product.ProductID;
}
// Update the data using a transaction
productsAPI.UpdateWithTransaction(products);
// Refresh the Grid
Products.DataBind();
}
protected void ModifyCategoriesWithoutTransaction_Click(object sender, EventArgs e)
{
// Get the set of products
ProductsBLL productsAPI = new ProductsBLL();
Northwind.ProductsDataTable products = productsAPI.GetProducts();
// Update each product's CategoryID
foreach (Northwind.ProductsRow product in products)
{
product.CategoryID = product.ProductID;
}
// Update the data WITHOUT using a transaction
NorthwindTableAdapters.ProductsTableAdapter productsAdapter =
new NorthwindTableAdapters.ProductsTableAdapter();
productsAdapter.Update(products);
// Refresh the Grid
Products.DataBind();
}
refresh按钮的Click事件处理器仅仅调用Products GridView的DataBind方法将数据重新绑定到ridView控件. (编辑:开发网_商丘站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |





