使用 DataAdapter 执行数据源批量更新

SqlDataAdapter 类

SqlDataAdapterDataSet 和 SQL Server 之间的桥接器,用于检索和保存数据。 SqlDataAdapter 通过对数据源使用适当的 Transact-SQL 语句映射 Fill(它可更改 DataSet 中的数据以匹配数据源中的数据)和 Update(它可更改数据源中的数据以匹配 DataSet 中的数据)来提供这一桥接。 更新是逐行进行的。 对于每个已插入、修改和删除的行,Update 方法会确定已对其执行的更改的类型(InsertUpdateDelete)。 根据更改类型,执行 InsertUpdateDelete 命令模板将已修改的行传播给数据源。 SqlDataAdapter 填充 DataSet 时,它为返回的数据创建必需的表和列(如果这些表和列尚不存在)。 但是,除非 MissingSchemaAction 属性设置为 AddWithKey,否则这个隐式创建的架构中不包括主键信息。 也可以使用 FillSchema,让 SqlDataAdapter 创建 DataSet 的架构,并在用数据填充它之前就将主键信息包括进去。

 

DataAdapter 的 Update 方法会循环访问指定 DataTable 中的行,检查每个 DataRow,确定是否已修改。如果该行已修改,将根据该行的 RowState 属性值调用相应的 UpdateCommand、InsertCommand 或 DeleteCommand。每一次行更新都涉及网络与数据库之间的双向数据传输

下面是对RowState的说明:

每个 DataRow 对象都具有 RowState 属性,您可以检查此属性来确定行的当前状态。下表提供了对每个 RowState 枚举值的简短说明。

RowState 值                                                                                说明 
Unchanged                              自上次调用 AcceptChanges 以来或由 DataAdapter.Fill 创建该行以来,没有进行任何更改。 
Added                                                          已将该行添加到表中,但尚未调用 AcceptChanges。 
Modified                                                                          已更改了行的某个元素。 
Deleted                                                        已从表中删除该行,并且尚未调用 AcceptChanges。 
Detached       该行不是任何 DataRowCollection 的一部分。新创建的行的 RowState 设置为 Detached。通过调用 Add 方法将新的DataRow 添加到 DataRowCollection 后,RowState 属性的值设置为 Added。将使用 Remove 方法,或使用 Delete 方法接着使用 AcceptChanges 方法从 DataRowCollection 中移除的行也设置为 Detached。


对 DataSet、DataTable 或 DataRow 调用 AcceptChanges 时,会移除行状态为 Deleted 的所有行。剩余行的行状态为 Unchanged,并且 Original 行版本中的值将被 Current 行版本值覆盖。调用 RejectChanges 时,会移除行状态为 Added 的所有行。剩余行的行状态为 Unchanged,并且 Current 行版本中的值将被 Original 行版本值覆盖。

SqlDataAdapter.UpdateBatchSize 属性

在 ADO.NET 2.0 中,DataAdapter 公开了 UpdateBatchSize 属性。将 UpdateBatchSize 设置为正整数值将使对数据库的更新以指定大小的批次进行发送。例如,如果将 UpdateBatchSize 设置为 10,会将 10 个独立的语句组合在一起并作为一批提交。将 UpdateBatchSize 设置为 0 将导致 DataAdapter 使用服务器可以处理的最大批次的大小。如果将其设置为 1,则禁用批量更新,因为此时每次发送一行。此操作可以减少到服务器的往返过程数,执行极大规模的批处理会降低性能。 因此,在实现应用程序前应进行测试以得到最佳的批大小。

效果

 0

                          批大小没有限制。

 1

                            禁用批量更新。

>1 

     一次使用多批 UpdateBatchSize 操作来发送更改。

将此值设置为 1 之外的值时,与 SqlDataAdapter 关联的所有命令必须将其 UpdatedRowSource 属性设置为 NoneOutputParameters否则将引发异常。如果该值设置为小于零的数,将引发 ArgumentOutOfRangeException

SqlCommandBuilder 类
SqlDataAdapter 不会自动生成实现 DataSet 的更改与关联的 SQL Server 实例之间的协调所需的 Transact-SQL 语句。 但是,如果设置了 SqlDataAdapterSelectCommand 属性,则可以创建一个 SqlCommandBuilder 对象来自动生成用于单表更新的 Transact-SQL 语句。 然后,SqlCommandBuilder 将生成其他任何未设置的 Transact-SQL 语句。 

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

SelectCommand 必须至少返回一个主键列或唯一的列 如果什么都没有返回,就会产生 InvalidOperation 异常,不生成命令。所以用此方法批量更新数据时数据表必须要设置主键。

SqlCommandBuilder 还使用由 SelectCommand 引用的 ConnectionCommandTimeoutTransaction 属性。 如果修改了这些属性中的一个或多个,或者替换了 SelectCommand 本身,用户则应调用 RefreshSchema 否则,InsertCommandUpdateCommandDeleteCommand 属性都保留它们以前的值。

SqlCommandBuilder 对象可以使用以下方法自动获取更新,插入,删除操作所需SqlCommand 对象。

 

GetInsertCommand() 获取自动生成的、对数据库执行插入操作所需的 SqlCommand 对象。

GetUpdateCommand() 获取自动生成的、对数据库执行更新操作所需的 SqlCommand 对象。

GetDeleteCommand() 获取自动生成的、对数据库执行删除操作所需的 SqlCommand 对象。

批量更新数据实例:

public static void BatchUpdate(DataTable dataTable,Int32 batchSize) { // Assumes GetConnectionString() returns a valid connection string. string connectionString = GetConnectionString(); // Connect to the AdventureWorks database. using (SqlConnection connection = new SqlConnection(connectionString)) { // Create a SqlDataAdapter. SqlDataAdapter adapter = new SqlDataAdapter(); // Set the UPDATE command and parameters. adapter.UpdateCommand = new SqlCommand( "UPDATE Production.ProductCategory SET " + "Name=@Name WHERE ProductCategoryID=@ProdCatID;", connection); adapter.UpdateCommand.Parameters.Add("@Name", SqlDbType.NVarChar, 50, "Name"); adapter.UpdateCommand.Parameters.Add("@ProdCatID", SqlDbType.Int, 4, "ProductCategoryID"); adapter.UpdateCommand.UpdatedRowSource = UpdateRowSource.None; // Set the INSERT command and parameter. adapter.InsertCommand = new SqlCommand( "INSERT INTO Production.ProductCategory (Name) VALUES (@Name);", connection); adapter.InsertCommand.Parameters.Add("@Name", SqlDbType.NVarChar, 50, "Name"); adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.None; // Set the DELETE command and parameter. adapter.DeleteCommand = new SqlCommand( "DELETE FROM Production.ProductCategory " + "WHERE ProductCategoryID=@ProdCatID;", connection); adapter.DeleteCommand.Parameters.Add("@ProdCatID", SqlDbType.Int, 4, "ProductCategoryID"); adapter.DeleteCommand.UpdatedRowSource = UpdateRowSource.None; // Set the batch size. adapter.UpdateBatchSize = batchSize; // Execute the update. adapter.Update(dataTable); } }   

使用OracleDataAdapter批量更新数据源相关文章:

OracleCommandBuilder 类

Oracle 和 ADO.NET

System.Data.OracleClient 中的类型已过时。 这些类型在 .NET Framework 4 中受到支持,但将在以后的版本中删除。 Microsoft 建议使用第三方 Oracle 提供程序。

相关文章:

使用 DataAdapter 执行批量更新

使用 DataAdapter 更新数据源

处理与批量更新有关的事件和错误

使用DataAdapter更新数据源实例

你可能感兴趣的:(sql,数据库,server,command,delete,insert,dataset)