使用 DataAdapter 和 DataSet 更新数据库

DataAdapter 的 Update 方法可调用来将 DataSet 中的更改解析回数据源 。与 Fill 方法类似, Update 方法将 DataSet 的实例和可选的 DataTable 对象或 DataTable 名称用作参数 。 DataSet 实例是包含已作出的更改的 DataSet ,而 DataTable 标识从其中检索更改的表。

当调用 Update 方法时,DataAdapter 将分析已作出的更改并执行相应的命令(INSERT、UPDATE 或 DELETE)。 DataAdapter 遇到对 DataRow 的更改时,它将使用 InsertCommand、UpdateCommand 或 DeleteCommand 来处理该更改。这样,您就可以通过在设计时指定命令语法并在可能时通过使用存储过程来尽量提高 ADO.NET 应用程序的性能。在调用 Update 之前,必须显式设置这些命令。如果调用了 Update 但不存在用于特定更新的相应命令(例如,不存在用于已删除行的 DeleteCommand),则将引发异常。

Command 参数可用于为 DataSet 中每个已修改行的 SQL 语句或存储过程指定输入和输出值。有关更多信息,请参见将参数用于 DataAdapter。

如果 DataTable 映射到单个数据库表或从单个数据库表生成,则可以利用 CommandBuilder 对象自动生成 DataAdapter 的 DeleteCommand、InsertCommand 和 UpdateCommand。有关更多信息,请参见自动生成的命令。

Update 方法会将更改解析回数据源,但是自上次填充 DataSet 以来,其他客户端可能已修改了数据源中的数据。若要使用当前数据刷新 DataSet,请再次使用 DataAdapter 填充 (Fill) DataSet。新行将添加到该表中,更新的信息将并入现有行。Fill 方法通过检查 DataSet 中行的主键值及 SelectCommand 返回的行来确定是否要添加一个新行或更新现有行。如果 Fill 方法发现 DataSet 中某行的主键值与 SelectCommand 返回结果中某行的主键值相匹配,则它将用 SelectCommand 返回的行中的信息更新现有行,并将现有行的 RowState 设置为 Unchanged如果 SelectCommand 返回的行所具有的主键值与 DataSet 中行的任何主键值都不匹配,则 Fill 方法将添加 RowState 为 Unchanged 的新行。

注意   如果 SelectCommand 返回 OUTER JOIN 的结果,则 DataAdapter 不会为结果 DataTable 设置 PrimaryKey 值。您需要自己定义 PrimaryKey 以确保正确解析重复行。有关更多信息,请参见为表定义主键。

若要处理可能在 Update 操作过程中发生的异常,可以使用 RowUpdated 事件在这些异常发生时响应行更新错误(请参见使用 DataAdapter 事件),或者可以在调用 Update 之前将 DataAdapter.ContinueUpdateOnError 设置为 true,然后在 Update 完成时响应存储在特定行的 RowError 属性中的错误信息(请参见添加和读取行错误信息)。

注意   如果对 DataSet、DataTable 或 DataRow 调用 AcceptChanges,则将使一个 DataRow 的所有 Original 值都将被改写为该 DataRow 的 Current 值。如果已修改将该行标识为唯一行的字段值,那么当调用 AcceptChanges 后,Original 值将不再匹配数据源中的值。

以下示例演示如何通过显式设置 DataAdapter 的 UpdateCommand 来执行对已修改行的更新。请注意,在 UPDATE 语句的 WHERE 子句中指定的参数设置为使用 SourceColumn 的 Original 值。这一点很重要,因为 Current 值可能已被修改,并且可能不匹配数据源中的值。Original 值是曾用来从数据源填充 DataTable 的值。

SqlClient

 [C#]

SqlDataAdapter catDA = new SqlDataAdapter("SELECT CategoryID, CategoryName FROM Categories", nwindConn);   

catDA.UpdateCommand = new SqlCommand("UPDATE Categories SET CategoryName = @CategoryName " + "WHERE CategoryID = @CategoryID" , nwindConn);
catDA.UpdateCommand.Parameters.Add("@CategoryName", SqlDbType.NVarChar, 15, "CategoryName");

SqlParameter workParm = catDA.UpdateCommand.Parameters.Add("@CategoryID", SqlDbType.Int);

workParm.SourceColumn = "CategoryID";

workParm.SourceVersion = DataRowVersion.Original;

DataSet catDS = new DataSet();

catDA.Fill(catDS, "Categories");  

DataRow cRow = catDS.Tables["Categories"].Rows[0];

cRow["CategoryName"] = "New Category";

catDA.Update(catDS);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值