批量加载SQL Server 表和SqlDataAdapter.Update数据源(1)

本文介绍了如何使用SqlDataAdapter的Update方法结合SqlCommandBuilder自动生成SQL语句,实现对DataTable的修改同步到数据库。同时,详细阐述了SqlBulkCopy类的使用,用于高效地批量加载数据到SQL Server表中。通过设置BatchSize、ColumnMappings等属性,可以灵活控制批量操作的性能和数据映射。

  SqlDataAdapter.Update数据源

SqlCommand 类
表示要对 SQL Server 数据库执行的一个 Transact-SQL 语句或存储过程。无法继承此类
方法:
1、BeginExecuteNonQuery
 启动此 SqlCommand 描述的 Transact-SQL 语句或存储过程的异步执行,一般情况下执行 INSERT、

DELETE、UPDATE 和 SET 语句等命令。每调用一次 BeginExecuteNonQuery,都必须调用一次通常在单独

的线程上完成操作的 EndExecuteNonQuery。
2、ExecuteNonQuery
 执行 Transact-SQL INSERT、DELETE、UPDATE 及 SET 语句等命令。
3、ExecuteReader
 执行返回行的命令。为了提高性能,ExecuteReader 使用 Transact-SQL sp_executesql 系统存储过程

调用命令。因此,如果 ExecuteReader 用于执行命令(例如 Transact-SQL SET 语句),则它可能不会

产生预期的效果。
 
http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlcommand(VS.80).aspx

SqlDataAdapter 类
表示用于填充 DataSet 和更新 SQL Server 数据库的一组数据命令和一个数据库连接。无法继承此类。

SqlDataAdapter 是 DataSet 和 SQL Server 之间的桥接器,用于检索和保存数据。SqlDataAdapter 通

过对数据源使用适当的 Transact-SQL 语句映射 Fill(它可更改 DataSet 中的数据以匹配数据源中的数

据)和 Update(它可更改数据源中的数据以匹配 DataSet 中的数据)来提供这一桥接。更新是逐行进行

的。对于每个已插入、修改和删除的行,Update 方法会确定已对其执行的更改的类型(Insert、Update

或 Delete)。根据更改类型,执行 Insert、Update 或 Delete 命令模板将已修改的行传播给数据源。

注意:当 SqlDataAdapter 填充 DataSet 时,它为返回的数据创建必需的表和列(如果这些表和列尚不

存在)。但是,除非 MissingSchemaAction 属性设置为 AddWithKey,否则这个隐式创建的架构中不包括

主键信息。也可以使用 FillSchema,让 SqlDataAdapter 创建 DataSet 的架构,并在用数据填充它之前

就将主键信息包括进去

SqlDataAdapter 包括 SelectCommand、InsertCommand、DeleteCommand、UpdateCommand 和

TableMappings 属性,以便于数据的加载和更新。
http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqldataadapter.aspx

SqlCommandBuilder 类
自动生成单表命令,用于将对 DataSet 所做的更改与关联的 SQL Server 数据库的更改相协调。无法继承此类。
SqlDataAdapter 不会自动生成实现 DataSet 的更改与关联的 SQL Server 实例之间的协调所需的 Transact-SQL 语句。但是,如果设置了 SqlDataAdapter 的 SelectCommand 属性,则可以创建一个 SqlCommandBuilder 对象来自动生成用于单表更新的 Transact-SQL 语句。然后,SqlCommandBuilder 将生成其他任何未设置的 Transact-SQL 语句。
http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlcommandbuilder(VS.80).aspx

如何单表自动生成命令(使用 CommandBuilder 自动生成 SQL 语句 ):
条件一:必须是 DataTable 映射到单个数据库表或者是从单个数据库表中生成的
DbCommandBuilder 对象来自动生成 DbDataAdapter 的 DeleteCommand、InsertCommand 和

UpdateCommand(例子使用的是SqlCommandBuilder)
条件二:为了能够自动生成命令,必须设置 SelectCommand 属性(既必须至少使用过一次select 查询语

句),这是最低要求。 由 SelectCommand 属性检索的表架构确定自动生成的 INSERT、UPDATE 和 DELETE

语句的语法。

  为了返回构造 INSERT、UPDATE 和 DELETE SQL 命令所需的元数据,DbCommandBuilder 必须执行

SelectCommand。 因此,必须额外经历一次到数据源的过程,这可能会降低性能。若要实现最佳性能,请

显式指定命令而不是使用 DbCommandBuilder。

SqlDataAdapter..::.Update 方法
Update(Object);为指定的 Object(DataRow/DataSet/DataTable/DataRow) 对象数组中每个已插入、已

更新或已删除的行调用相应的 INSERT、UPDATE 或 DELETE 语句.(****继承自 DbDataAdapter。)

结合单表自动生成命令于SqlDataAdapter.Update方法,可以很方便的对查询到得Object

(DataRow/DataSet/DataTable/DataRow) 对象 修改后 在自动更新到数据源表中

实例:

批量加载SQL Server 表 

SqlBulkCopy 类
使您可以用其他源的数据有效批量加载 SQL Server 表。

 属性:
   名称            说明
 BatchSize         每一批次中的行数。在每一批次结束时,将该批次中的行发送到服务器。 
 BulkCopyTimeout   超时之前操作完成所允许的秒数。 
 ColumnMappings    返回 SqlBulkCopyColumnMapping 项的集合。列映射定义数据源中的列和目标表中                     的列之间的关系。  
 NotifyAfter       定义在生成通知事件之前要处理的行数。
 DestinationTableName 服务器上目标表的名称。
 
 方法:
   WriteToServer 已重载. 将所有行从数据源复制到 SqlBulkCopy 对象的 DestinationTableName 属性指定的目标表中。
  重载列表:
 名称                                  说明
 WriteToServer(array<DataRow>[]()[])   将所提供的 DataRow 数组中的所有行复制到 SqlBulkCopy                                         对象的 DestinationTableName 属性指定的目标表中。 

 WriteToServer(DataTable)              将所提供的 DataTable 中的所有行复制到 SqlBulkCopy 对                                         象的 DestinationTableName 属性指定的目标表中。 

 WriteToServer(IDataReader)            将所提供的 IDataReader 中的所有行复制到 SqlBulkCopy                                          对象的 DestinationTableName 属性指定的目标表中。 

 WriteToServer(DataTable,DataRowState) 只将与所提供 DataTable 中所提供行状态匹配的行复制                                            到SqlBulkCopy 对象的 DestinationTableName 属性
                                       指定的目标表中。
 
##IDataReader 接口:: 提供一种方法来读取一个或多个通过在数据源执行命令所获得的只进结果集流,这是由访问关系数据库的 .NET Framework 数据提供程序实现的。
  使用IDataReader 和 IDataRecord 接口可以通过继承类实现 DataReader 类,该类提供一种读取结果集的一个或多个只进流的方法

SqlBulkCopy..::.ColumnMappings 属性
类型:System.Data.SqlClient..::.SqlBulkCopyColumnMappingCollection
列映射集合。默认情况下为空集合。
如果数据源和目标表具有相同的列数,并且数据源中每个源列的序号位置匹配相应目标列的序号位置,则无需 ColumnMappings 集合。但是如果列计数不同,或序号位置不一致,则必须使用 ColumnMappings,以确保将数据复制到正确的列中。
在执行批量复制操作期间,可以访问此集合,但不能进行更改。任何更改尝试都将引发 InvalidOperationException。


SqlDataReader 类
提供一种从 SQL Server 数据库读取行的只进流的方式。无法继承此类。
若要创建 SqlDataReader,必须调用 SqlCommand 对象的 ExecuteReader 方法,而不要直接使用构造函数。
 方法:
 //GetName 获取指定列的名称。 
 //Read    使 SqlDataReader 前进到下一条记录。

 

实例:

 

 

附录

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值