加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码网 (https://www.900php.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

在ASP.NET 2.0中操作数据之六十一:在事务里对数据库修改进行封

发布时间:2016-11-24 04:42:39 所属栏目:MsSql教程 来源:站长网
导读:导言: 正如我们在第16章《概述插入、更新和删除数据》里探讨的那样,GridView控件内建的功能支持对每行数据的编辑和删除功能,你只需要稍稍动一下鼠标就可以创建丰富的数据修改界面而不用写一行代码.但是,在某些情况下,这还不够,我们需要让用户能够成

  打开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)”,点完成。

/uploads/allimg/c161121/14OI95013320-45F42.gif
图5:设置ObjectDataSource使用ProductsBLL Class类的GetProducts方法

/uploads/allimg/c161121/14OI9501593P-464444.gif
图6:在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>


此时,在Visual Studio的设计模式里,界面看起来和下面的截屏差不多:

/uploads/allimg/c161121/14OI9501V0Z-4O616.gif
图7:页面包含一个GridView控件和三个Button Web控件

为这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控件.

(编辑:源码网)

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

热点阅读