2023年6月21日发(作者:)

使⽤DataAdapter和DataSet更新数据库DataAdapter 的 Update ⽅法可调⽤来将 DataSet 中的更改解析回数据源 。与 Fill ⽅法类似, Update ⽅法将 DataSet 的实例和可选的DataTable 对象或 DataTable 名称⽤作参数 。 DataSet 实例是包含已作出的更改的 DataSet ,⽽ DataTable 标识从其中检索更改的表。当调⽤ Update ⽅法时,DataAdapter 将分析已作出的更改并执⾏相应的命令(INSERT、UPDATE 或 DELETE)。当 DataAdapter 遇到对 DataRow 的更改时,它将使⽤ InsertCommand、UpdateCommand 或 DeleteCommand 来处理该更改。这样,您就可以通过在设计时指定命令语法并在可能时通过使⽤存储过程来尽量提⾼ 应⽤程序的性能。在调⽤ 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 之前将 ueUpdateOnError 设置为 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); Command = new SqlCommand("UPDATE Categories SET CategoryName = @CategoryName " + "WHERECategoryID = @CategoryID" , nwindConn);("@CategoryName", ar, 15, "CategoryName");SqlParameter workParm = ("@CategoryID", );Column = "CategoryID";Version = al;DataSet catDS = new DataSet();(catDS, "Categories");

DataRow cRow = ["Categories"].Rows[0];cRow["CategoryName"] = "New Category";(catDS);

2023年6月21日发(作者:)

使⽤DataAdapter和DataSet更新数据库DataAdapter 的 Update ⽅法可调⽤来将 DataSet 中的更改解析回数据源 。与 Fill ⽅法类似, Update ⽅法将 DataSet 的实例和可选的DataTable 对象或 DataTable 名称⽤作参数 。 DataSet 实例是包含已作出的更改的 DataSet ,⽽ DataTable 标识从其中检索更改的表。当调⽤ Update ⽅法时,DataAdapter 将分析已作出的更改并执⾏相应的命令(INSERT、UPDATE 或 DELETE)。当 DataAdapter 遇到对 DataRow 的更改时,它将使⽤ InsertCommand、UpdateCommand 或 DeleteCommand 来处理该更改。这样,您就可以通过在设计时指定命令语法并在可能时通过使⽤存储过程来尽量提⾼ 应⽤程序的性能。在调⽤ 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 之前将 ueUpdateOnError 设置为 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); Command = new SqlCommand("UPDATE Categories SET CategoryName = @CategoryName " + "WHERECategoryID = @CategoryID" , nwindConn);("@CategoryName", ar, 15, "CategoryName");SqlParameter workParm = ("@CategoryID", );Column = "CategoryID";Version = al;DataSet catDS = new DataSet();(catDS, "Categories");

DataRow cRow = ["Categories"].Rows[0];cRow["CategoryName"] = "New Category";(catDS);