知识大全 使用ADO.NET2.0提升数据交互性能

Posted

篇首语:古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 使用ADO.NET2.0提升数据交互性能相关的知识,希望对你有一定的参考价值。

使用ADO.NET2.0提升数据交互性能  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  前言      这篇文章起源于在公司写的一个PPT 但是由于PPT本身的限制很多内容无法表达或是详细的解释 于是变下定了决心 写篇文档!      在这篇文章里我将尽量简单的描述下ADO NET 的新特性 尤其是配合SQL Server 所展现出来的强大实力 如果想进一步了解ADO NET 编程方面的话 可以去阅读Glenn Johnson的 ADO NET 高级编程[微软推荐丛书] 定价: 元 网络购书的话打了折只要 块就可以了         一 功能强大的ADO       年底( 年 月)与 SQL Server 一起出现的是 NET Framework 版本 其中用来访问数据库的 ADO NET类也升级到 ADO NET 版         ADO NET 除了增强旧功能外 也提供了相当多的新功能 包含了以基础类为本(base class based)的数据源提供程序(provider)模型 异步访问架构 批处理更新与大量数据复制(bulk copy) SQL Server 的回调通知 单一连接同时多执行结果集(MARS) 执行统计 强化的 DataSet 类等等 换句话说 若要有效发挥 SQL Server 的功能 前端应用程序最好用 ADO NET 来开发         ADO NET 提供了相当多的新增功能 一些与数据源提供程序无关 也就是访问各种数据库都可以用到的功能 但有很大的一部分是专属于 SQL Server 针对 SQL Server 的新功能提供给前端应用程序开发使用         二: 使用多数据结果集(仅限 )      在之前版本的 SQL Server 同一时间一条连接只能传递一个 SELECT 语法执行后返回的结果集 如果想在一次连接后返回多个查询内容只能使用类似如下的方法来实现            SqlDataAdapter myDataAdapter = new SqlDataAdapter( StoredProcedureName myConnection);    myDataAdapter SelectCommand CommandType = CommandType StoredProcedure;       myDataAdapter SelectCommand Parameters Add( @sqlstr sqlstr);    DataSet ds = new DataSet();    myDataAdapter Fill(ds);    return ds;    ds Tables[ ] ds Tables[ ] ds Tables[ ] 分别对应三个结果集      SQL Server 提供了在同一条连接上可以同时传递多个没有游标结构(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 cmd = new SqlCommand( select * from customers conn);    SqlCommand cmd = new SqlCommand( select * from orders conn);    SqlDataReader rdr = cmd ExecuteReader();    // next statement causes an error prior to SQL Server    SqlDataReader rdr = cmd ExecuteReader();    // now you can reader from rdr and rdr at the same time

  三 异步执行Command命令      在 ADO NET 以前 通过 Command 类(如 SqlCommand OleDbCommand等)执行 SQL      命令的线程一定要停下来等待执行结果 ADO NET 新增了异步程序访问接口(asynchronous API) 让线程发出命令后可以继续执行接下去的程序代码      而在 ADO NET 当前的版本只有 SqlClient 支持异步程序访问接口      以往编写程序时 我们可以直接通过 NET Framework 所提供的多线程机制 或是以 Delegate 类包装多线程的方式 在 NET Framework 所提供的异步架构下 设计调用执行 Command 对象实例 这些方法都是让一条工作线程(Worker Thread)停止在后台中等待执行结果 一旦有结果后 工作线程再通过标准的机制告知结果         原本 ADO NET 的 Command 对象执行 SQL 语法的方法有      ExecuteReader ExecuteNonQuery ExecuteXmlReader 以及 ExecuteScalar 等 搭配 NET      Framework 原来就提供的异步模型惯例 除了 ExecuteScalar 方法外 其余的方法都新增了以 Begin 和 End 关键字开始的一对方法 也就是说 ExecuteReader 方法是同步执行 若要以异步的方式执行相同的功能 则调用 BeginExecuteReader 和 EndExecuteReader 这一组方法 在 NET Framework 中 以 Begin 为字首的方法负责传入同名方法所需的参数 而以 End      为字首的方法用来取回执行结果      例如某个方法的定义如下      public override int ExecuteNonQuery()      则以异步调用的起始方法定义如下      public IAsyncResult BeginExecuteNonQuery(AsyncCallback callback object stateObject)      Begin~ 系列的方法会多加存放回调方法(Delegation)的指针参数 也就是上述语法中的 callback 参数 并提供语法中的 stateObject参数 让你设置想要带到 End~ 对应方法的信息 而 Begin~ 系列方法最后返回的是代表异步执行状态的 IAsyncResult 对象实例 而不是原本同步执行方法的返回结果 你可以借此查询异步执行的状况      

  而获得执行结果的方法定义如下      public int EndExecuteNonQuery(IAsyncResult asyncResult)      在调用与 Begin~ 对应的 End~ 方法时 需要带入 Begin~ 方法所返回的 IAsyncResult      对象实例 异步执行完毕后 取回与原先同步执行方法相同的执行结果         由于我们在执行完 Command 对象访问数据库的方法后 都会返回对象 如 ExecuteReader 取回 DataReader实例 ExecuteNonQuery 取回受影响的记录条数 ExecuteXmlReader 取回 XmlReader 实例 因此大概都需要通过End系列方法来获得执行结果 否则这些结果就遗失在系统中      若要异步执行 Command 命令 另一个必需设置的是 数据库连接字符串内要加上 async=true 属性 若连接字符串没有加上该属性 而通过 Command对象实例调用异步执行的方法 则会产生异常(exception) 若 Command 通过连接执行时 重头到尾都是以同步的方式执行 则依照默认 async=false 的方式设置比较节省资源 若某些命令需要同步执行 另一些需要异步执行 则可以考虑使用不同的连接      在介绍范例应用程序前 我们先稍微谈一下 NET Framework 所提供的公共的异步运行应用程序设计模式 不只是 ADO NET 在其他访问耗时的程序编写上 也都可以套用这个模式       NET Framework内置了让应用程序异步运行的功能 让你在编写应用程序时 不会因为某些耗时等待的操作让程序停止响应 操作界面停滞让用户感觉起来好像死机一样 一般会以多线程的方式处理这种需求 但若你不熟悉线程的运行 或是想利用线程池(Thread Pool)的好处 都可以在较为耗时的操作上 采用 NET Framework 所提供的异步功能      一般来说文件 I/O 网络访问乃至于 Web Services 访问 以及本节所讨论的 DB 访问等都较为耗时 NET Framework为这一类的类都提供了上述以 Begin~/End~开头的非同步执行方法 而这些方法皆成对出现 当然 也有可能是自己编写的方法其商业逻辑非常复杂 导致调用该方法后 需要等待一段时间来完成 这时还可以通过 NETFramework 所提供的委托(Delegate)类来创建异步运行         但是实际在我们的应用中      但我们不需要获知DB服务器的返回信息时 我们推荐使用委托 尤其是在Web开发中      因为在页面线程启动异步数据库访问时 当页面业务执行完毕后仍然无法放开访问数据库的异步线程 这是我们不希望看到的 但是使用委托却可以避免这个麻烦(webservice异步应用中一样如此)

  四 使用SqlBulkCopy批量装载数据(仅限SqlClient)       以往访问 SQL Server 时 若有大量的数据记录需要添加到数据库内 例如从主机系统或是 NCR Teradata Oracle等数据库系统下载大量数据记录 我们想要将它们快速添加到 SQL Server 中 可以有的选择是调用 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 的 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= ;user id=oa;password=oapassword;initial catalog=test ))             sqlcon Open();       using (SqlBulkCopy bcp = new SqlBulkCopy(sqlcon))             bcp BulkCopyTimeout = ;       bcp DestinationTableName = dbo Test ;       bcp ColumnMappings Add( id id );       bcp ColumnMappings Add( name name );       bcp ColumnMappings Add( name name );       bcp ColumnMappings Add( name name );       //映射到不同名列       bcp ColumnMappings Add( changedname name );       bcp WriteToServer(dt);       sqlcon Close();                     但是SqlBulkCopy使用时要注意以下几点       .确认确实需要大容量更新在执行此操作 (几十行的数据请尽量使用别的渠道把)       .       .确认数据一致性 与检查机制 以免遇到主键冲突 数据不符格式等意外       .       .SqlBulkCopy操作可能会导致对目标表元数据的更改(例如 禁用约束检查时) 如果出现这种情况 访问大容量插入表的并发快照隔离事务将失败       SqlBulkCopy将向数据库下大容量更新锁 请注意并发性 以免其他连接因长时间等待而超时

cha138/Article/program/net/201311/11944

相关参考

知识大全 使用ADO.NET2.0提升数据交互性能(1)

使用ADO.NET2.0提升数据交互性能(1)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nb

知识大全 在 ADO.NET2.0 中对于从您的数据源访问元数据

在ADO.NET2.0中对于从您的数据源访问元数据  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 ADO.NET2.0的十大新特性全面介绍

ADO.NET2.0的十大新特性全面介绍  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  本文简要

知识大全 ADO.NET 2.0 数据异步处理改善用户体验

ADO.NET2.0数据异步处理改善用户体验  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  支持

知识大全 详解MySQL数据库提升性能的八种方法[2]

详解MySQL数据库提升性能的八种方法[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  使用

知识大全 详解MySQL数据库提升性能的八种方法[1]

详解MySQL数据库提升性能的八种方法[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  选取

知识大全 ADO.NET 2.0中的DataSet和DataTable

ADO.NET2.0中的DataSet和DataTable  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一

知识大全 ADO.NET 2.0 动态指定 ObjectDataSource 的 SelectMethod

ADO.NET2.0动态指定ObjectDataSource的SelectMethod  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布

知识大全 经测试ADO.NET 2.0竟然比1.0要慢

经测试ADO.NET2.0竟然比1.0要慢  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  镜子里

知识大全 正规化的表格设计能提升应用性能(一)

在动态网站的设计中数据库设计的重要性不言而喻如果设计不当查询起来就非常吃力程序的性能也会受到影响无论你使用的是MySQL或者Oracle数据库通过进行正规化的表格设计可以令你的PHP代码更具可读性更容