ASP.NET 2.0数据教程:插入,更新和删除数据

开发 后端
本文介绍了在asp.net 2.0中如何创建一个数据访问层(DAL)的第四步:插入,更新和删除数据。

ASP.NET 2.0数据教程第四步:插入,更新和删除数据

ASP.NET 2.0中常用的插入,更新和删除数据的模式有两种。***种模式,我称之为DB直接模式,涉及的方法被调用时,会向数据库里发出一个INSERT, 或UPDATE,或DELETE命令,这个命令只对单个数据库记录做操作。象这样的方法一般接受一系列对应于插入,更新或删除的值的标量参数(譬如整数,字符串,布尔值,日期时间等)。譬如,用这个模式来操作Products表的话,删除方法会接受一个整数参数,代表所需要删除的记录的ProductID,而插入方法则会接受一个对应于ProductName的字符串,对应 于UnitPrice的decimal值,对应于UnitsOnStock的整数等等。

每个插入,更新,和删除请求都被立刻发送到数据库 

图 21: 每个插入,更新,和删除请求都被立刻发送到数据库

另外一个模式,我称之为批更新模式,可以在一个方法调用里更新整个DataSet,或者整个DataTable,或 者一个DataRow集合。在这个模式里,开发人员在一个DataTable中删除,插入,修改DataRow,然后把这 些DataRow或整个DataTable传给一个更新方法。然后这个方法会轮循传入的DataRow们,通过DataRow的RowState属 性属性来决定这些DataRow是否被改动过,或是新记录,或是被删除的记录,然后为每个记录发出合适的数据库命令。

在Update 方法调用之后,所有的变动都与数据库同步了 

图 22: 在Update 方法调用之后,所有的变动都与数据库同步了

在ASP.NET 2.0默认情形下,TableAdapter采用批更新模式,但也支持DB直接模式。因为我们在创建我们的TableAdapter时的高级选项中选择了“生成插入,更新,和删除语句” 这个选项,ProductsTableAdapter 包含了一个 Update()方法,该方法实现了批更新模式。具体地说,TableAdapter包含了一个Update() 方法,可以传入一个强类型 的DataSet,或者一个强类型的DataTable,或者一个和多个DataRow。假如你在一开始创建TableAdapter时的选项中没有清除“生成DB直接方法(GenerateDBDirectMethods)”复选框的话,DB直接模 式也会通过Insert(),Update()和Delete()方法来实现。

这两种数据修改模式都使用了TableAdapter的InsertCommand,UpdateCommand, 和DeleteCommand属性来向数据库发出对应的INSERT,UPDATE和DELETE命令。你可以在DataSet设计器里点击TableAdapter,然后在属性窗口查看和改 动InsertCommand,UpdateCommand, 和DeleteCommand属性。(确认你选择了TableAdapter,并且ProductsTableAdapter对象是属性窗口中下拉框里被选中的项)

TableAdapter包含InsertCommand,UpdateCommand, 和DeleteCommand等属性 

图23: TableAdapter包含InsertCommand,UpdateCommand, 和DeleteCommand等属性

想查看或改动这些数据库命令的属性的话,点击CommandText子属性,这会启动对应的查询生成器。

在查询生成器里配置插入,更新,删除语句 

图 24: 在查询生成器里配置插入,更新,删除语句

下面的编码例子示范了如何使用批更新模式来把没被终止的,且库存等于或少于25个单元的产品的价格加倍:

  1. NorthwindTableAdapters.ProductsTableAdapter   
  2.  
  3. productsAdapter =  
  4.   new NorthwindTableAdapters.ProductsTableAdapter();  
  5.  
  6. // For each product, double its price if it is not discontinued   
  7.  
  8. and  
  9. // there are 25 items in stock or less  
  10. Northwind.ProductsDataTable products = productsAdapter.GetProducts();  
  11. foreach (Northwind.ProductsRow product in products)  
  12.    if (!product.Discontinued && product.UnitsInStock   
  13.  
  14. <  = 25)  
  15.       product.UnitPrice *= 2;  
  16.  
  17. // Update the products  
  18. productsAdapter.Update(products);  
  19.  

下面的编码示范如何使用DB直接模式删除一个产品,更新一个产品,然后添加一个新的产品:

C#

  1. NorthwindTableAdapters.ProductsTableAdapter   
  2.  
  3. productsAdapter = new   
  4.  
  5. NorthwindTableAdapters.ProductsTableAdapter();  
  6.  
  7. // Delete the product with ProductID 3  
  8. productsAdapter.Delete(3);  
  9.  
  10. // Update Chai (ProductID of 1), setting the UnitsOnOrder to   
  11.  
  12. 15  
  13. productsAdapter.Update("Chai", 1, 1, "10 boxes x 20 bags",  
  14.   18.0m, 39, 15, 10, false, 1);  
  15.  
  16. // Add a new product  
  17. productsAdapter.Insert("New Product", 1, 1,  
  18.   "12 tins per carton", 14.95m, 15, 0, 10, false);  
  19.    

创建自定义的插入,更新,删除方法

用DB直接法生成的Insert(), Update(),和Delete()方法有时 候会感觉有点不方便,特别是当数据表有许多字段的时候。看一下前面这个编码例子,没有IntelliSense的帮助的话,不是很清楚Products表的哪个字段对应Update()和Insert()方法中的哪个输入参数。有时候我们只要更新一到二个字 段或者需要一个自定义的Insert()方法,这个方法需要返回刚插入的记录 的IDENTITY(自增)的字段值。

要创建这样的自定义方法,回到DataSet设计器。在TableAdapter上按右鼠标,选择“添加查询”,然后回 到TableAdapter配置向导。在第二屏上,我们可以指明要生成的查询的类型。让我们生成一个添加新 的product(产品)记录,然后返回新添加记录的ProductID值的方法。因此,选择生成一个插入(INSERT)型查询。

创建一个给Products表添加新记录的方法 

图25: 创建一个给Products表添加新记录的方法

下一个屏显示InsertCommand的CommandText属性。在查询语句后面,增添一个SELECT SCOPE_IDENTITY()的查询,这查询将返回当前同一个操作范围内插 入IDENTITY字段的***那个identity 值。(详见技术文档中关 于SCOPE_IDENTITY()的内容以及为什么你应该http://weblogs.sqlteam.com/travisl/archive/2003/10/29/405.aspx)。确认在添加SELECT语句前,你在INSERT语句后面添一个分号 。

增添查询返回SCOPE_IDENTITY()值 

图26: 增添查询返回SCOPE_IDENTITY()值

***,把这个新方法命名为InsertProduct。

放方法名字设成InsertProduct  

图 27:放方法名字设成InsertProduct

当你返回DataSet设计器时,你将看到ProductsTableAdapter多了一个新的方法,InsertProduct。如果对应Products表的每个字段,这个新的方法没有对应的参数的话,非常可能的原因是,你忘了给INSERT语句的结尾添加一个分号(semi-colon)。重新配 置InsertProduct方法,确认在INSERT和SELECT语句间有个分号。

在ASP.NET 2.0的默认情形下,插入方法调用的是非查询(non-query)方法,意即,他们只返回受影响的记录数。但是,我们想要让InsertProduct方法返回一个查询返回的值,而不是受影响的记录数。这可以把InsertProduct方法的ExecuteMode属性改成Scalar(标量)来实现。

把ExecuteMode属性改成Scalar 

图 28:把ExecuteMode属性改成Scalar

下面的编码示范如何使用这个新的InsertProduct方法:

C# 

  1. NorthwindTableAdapters.ProductsTableAdapter   
  2.  
  3. productsAdapter = new   
  4.  
  5. NorthwindTableAdapters.ProductsTableAdapter();  
  6.  
  7. // Add a new product  
  8. int new_productID =   
  9.  
  10. Convert.ToInt32(productsAdapter.InsertProduct("New   
  11.  
  12. Product", 1, 1, "12 tins per carton",   
  13.  
  14. 14.95m, 10, 0, 10, false));  
  15.  
  16. // On second thought, delete the product  
  17. productsAdapter.Delete(new_productID);  
  18.  

【编辑推荐】

  1. 如何在IIS6.0中部署asp.net mvc程序
  2. 用Winform傻瓜式搭建asp.net mvc框架
  3. ASP.NET Session失效的编程思路
  4. ASP.NET Session 状态的存储
  5. 了解ASP.NET Web应用程序模型 

责任编辑:book05 来源: 博客堂
相关推荐

2009-07-27 16:09:05

GridView显示数

2009-07-24 17:15:52

SiteMapData

2009-07-24 13:25:43

创建数据访问层

2009-07-24 12:41:21

BLL类

2009-07-24 16:37:04

创建母版页asp.net 2.0

2009-07-27 03:21:00

breadcrumb导

2009-07-27 09:01:44

ObjectDataS

2009-07-27 16:22:54

GridView选择行

2024-01-08 09:10:35

PostgreSQL数据库管理系统

2009-07-24 17:08:31

添加站点地图asp.net

2009-07-24 14:15:51

数据访问层

2009-07-27 09:39:04

SelectMetho

2009-07-23 14:43:24

数据源控件ASP.NET 2.0

2009-07-27 09:28:55

TableAdapte

2009-07-22 17:21:27

ASP.NET 2.0

2009-07-28 14:06:28

ASP.NET 2.0

2009-07-27 08:51:24

ObjectDataS

2009-07-24 16:55:53

添加aspx页面

2009-07-27 16:53:15

ASP.NET 2.0

2009-07-24 13:08:03

BLL类ASP.NET 2.0
点赞
收藏

51CTO技术栈公众号