使用ADO.NET2.0提升数据交互性能

 1使用多数据结果集(仅限2005)
   SQL Server 2005提供了在同一条连接上可以同时传递多个没有游标结构(cursorless)的结果集(也称为默认结果集),此功能称为 Multiple Active Resultsets(MARS)。如此可以节省需要同时打开的连接数,但要注意的是连接字符串设置要加上 MultipleAct-iveResultSets=true 属性,否则默认不启动多数据结果集的功能。

  

string  connstr  =   " server=(local);database=northwind;integrated security=true;  " ; SqlConnection conn  =   new  SqlConnection(connstr); conn.Open(); SqlCommand cmd1  =   new  SqlCommand( " select * from customers " , conn); SqlCommand cmd2  =   new  SqlCommand( " select * from orders " , conn); SqlDataReader rdr1  =  cmd1.ExecuteReader();  //  next statement causes an error prior to SQL Server 2005 SqlDataReader rdr2 = cmd2.ExecuteReader();  //  now you can reader from rdr1 and rdr2 at the same time.

 

2.使用SqlBulkCopy批量装载数据(仅限SqlClient)

  以往访问 SQL Server 2000 时,若有大量的数据记录需要添加到数据库内,例如从主机系统或是 NCR Teradata、Oracle等数据库系统下载大量数据记录,我们想要将它们快速添加到 SQL Server 2000中,可以有的选择是调用 T-SQL 的 Bulk Insert 语法、通过Linked Server 执行 SELECT INTO 语法或是执行 bcp.exe 工具程序,以及通过 DTS 的 Bulk Insert Task 或启动Transform Data Task 的快速装载(Use Fast Load)设置。


  但若要通过自行编写的程序完成批次装载,只能以 C/C++ 调用 OLEDB 或 ODBC 的 Bulk API,无法通过 ADO.NET 或 ADO 等对象来执行。

  ADO.NET 2.0 的 SqlClient 提供了一个新的类称为 SqlBulkCopy,它让 DataSet 内大量的数据或是 DataReader通过数据流(Stream)直接读取大量的记录,可以快速将这些记录添加到目的数据库的数据表中。但要注意的是它并非如我们一般用的 bcp.exe工具程序,可以从某个符号分隔文件读取大量数据,选择性地搭配格式文件(Format File)将记录装载到数据库中,或是将数据库内的数据导出成为一个文件。但由于DataSet 能集成 XML 数据,因此依然可以采用 SqlBulkCopy 类型,轻松地通过 DataSet 将 XML 文件数据大量转入到数据库。



  可以利用SqlBulkCopy类快速写入大批量数据,针对SQL Server的优化,可以写入DataRow数据,DataTable,DataReader,并且可以映射不同的数据列名

  WriteToServer(DataTable)写入数据表

  WriteToServer(DataRow[])批次写入数据行

  WriteToServer(DataTable ,DataRowState)按行状态写入数据库表

WriteToServer(IDataReader)写入DataReader对象


  下面是个示例:
 

using  (SqlConnection sqlcon  =   new  SqlConnection( " Data Source=192.168.80.242;user id=oa;password=oapassword;initial catalog=test " )) { sqlcon.Open();  using  (SqlBulkCopy bcp  =   new  SqlBulkCopy(sqlcon)) { bcp.BulkCopyTimeout  =   3000 ; bcp.DestinationTableName  =   " dbo.Test01 " ; bcp.ColumnMappings.Add( " id " " id " ); bcp.ColumnMappings.Add( " name1 " " name1 " ); bcp.ColumnMappings.Add( " name2 " " name2 " ); bcp.ColumnMappings.Add( " name3 " " name3 " );  // 映射到不同名列 bcp.ColumnMappings.Add("changedname4", "name4"); bcp.WriteToServer(dt); sqlcon.Close(); } }


但是SqlBulkCopy使用时要注意以下几点:

  1   确认确实需要大容量更新在执行此操作,(几十行的数据请尽量使用别的渠道把). 

  2    确认数据一致性,与检查机制,以免遇到主键冲突,数据不符格式等意外。 

  3   SqlBulkCopy操作可能会导致对目标表元数据的更改(例如,禁用约束检查时)。如果出现这种情况,访问大容量插入表的并发快照隔离事务将失败。

  4   SqlBulkCopy将向数据库下大容量更新锁,请注意并发性,以免其他连接因长时间等待而超时。

3.二进序列制化的Dataset

  Dataset有个好属性是支持序列化,但是有很多人对其提出了批评。不是这些人不喜欢Dataset支持序列化,而是序列化后的Dataset真的是太肥了。大量的

  <xs:element name=””,type…占用了大量的空间以至让人难以忍受。


  现在我们只需要设置 RemotingFormat 属性为SerializationFormat.Binary(默认是SerializationFormat.XML),则在序列化时完全采用二进制的数据格式,如此数据较小,因而较有效率。(官方的观点是缩为SerializationFormat.XML的1/4)。

4 结果集直接装载DataTable

  可以通过DataTableReader对象生成DataTable和DataSet。利用DataTable和DataSet在2.0版本中新引入的方法Load,可以传递DataTableReader或者任何实现IDataReader接口的类对象。下面的代码就是通过Load方法将dt1的数据传递到新的数据表dt2中:

 

DataTableReader dtRdr  =  dt1.CreateDataReader(); DataTable dt2  =   new  DataTable(); dt2.Load(dtRdr);


   在使用Load方法装载多行数据时,可以先调用BeginLoadData方法来避免通知 (notifications),索引维护(index maintenance)以及约束检查(constraint checking),然后再通过EndLoadData方法返回数据。

 5.轻量级对象和快速遍历

  ADO.NET 2.0中的DataTable提供了CreateDataReader方法(在之前的版本名为GetDataReader),该方法将创建一个 DataTableReader对象。DataTableReader与DataTable不同,它是一个轻量级的对象,其支持 Disconnected,这一点与DataReader(SqlDataReader)不同。这些特点决定遍历DataTableReader对象将更加快速,占用的数据资源更少(Disconnected)。下面的代码创建了一个DataTableReader对象,并将其绑定到 DataGridView控件上:
 

using  (SqlConnection cn  =   new  SqlConnection(cnStr)) { SqlCommand cmd  =   new  SqlCommand(sqlAllCustomers, cn); SqlDataAdapter adpt  =   new  SqlDataAdapter(cmd); DataTable dtCustomers  =   new  DataTable( " Customers " ); adpt.Fill(dtCustomers); DataTableReader dtRdr  =  ds.CreateDataReader(); dgvCustomers.DataSource  =  dtRdr; }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值