[.NET 4.5] ADO.NET / ASP.NET 使用 Async 和 Await 异步 存取数据库

此为文章备份,原文出处(我的网站)  [.NET
4.5] ADO.NET / ASP.NET 使用 Async 和 Await 异步 存取数据库

http://www.dotblogs.com.tw/mis2000lab/archive/2014/05/08/ado.net4.5_async_await_20140508.aspx

以前的ADO.NET也能作  "异步"(Async,大陆说法:异步),可以参考 KKBruce 2009/11月的文章:

SQLCOMMAND的异步行程

http://blog.kkbruce.net/2009/11/sqlcommand.html

但是, .NET 4.5 & VS 2012(含)后续新版本有新的作法

以下是(节录)MSDN网站的说明:

Visual Studio 2012 引入简化方法 (即异步程序设计),充分运用 .NET
Framework 4.5 
Windows 运行时间 中的异步支持。 编译程序会完成开发人员过去经常要做的困难工作,而您的应用程序仍保有类似同步程序代码的逻辑结构。
因此,您可以轻松地取得异步程序设计的所有优点。

Asynchrony 对可能会进行封锁的活动相当重要,例如,当应用程序存取 Web 时。
对网络资源的存取有时会变慢或延迟。 如果此类活动在同步进程中遭到封锁,整个应用程序就必须等候。 在异步进程中,应用程序可以继续进行其他不相依于
Web 资源的工作,直到可能的封锁工作完成。

Visual Basic 中的 Async
Await
关键词,以及 C# 中的
async
await
关键词,都是异步程序设计的核心。 您可以使用这两个关键词,在 .NET Framework 或
Windows 运行时间中使用资源建立异步方法,几乎就像建立同步方法一样轻松。 经由 async 和 await 定义的异步方法称为异步方法。

........................................................................................................................................................................

以下采用 ASP.NET为例,用 ADO.NET DataReader来撰写

范例源自「我的书本」里面提供的四大范本

第一,请宣告 System.Threading.Tasks 命名空间

C# ----  using System.Threading.Tasks;

VB ----  Imports System.Threading.Tasks

如果有必要的话,请在您的项目或是网站中,使用 NuGet

搜寻Microsoft.bcl.Async并且安装

接下来的 C#后置程序代码,程序如下

//****请加上 async关键词,在事件前方!!***

protected async void
Button1_Click(object sender, EventArgs e)

{

await MIS2000Lab_Async();

}

//*** 自己写的 "异步"函式 ***

//****请加上 async关键词,在函式前方!!***

// VB的写法 -- Protected
Shared
 Async Function
MIS2000Lab_Async() As
 Task(Of
System.Threading.Tasks.Task)

protected
static async Task MIS2000Lab_Async()

{

SqlConnection Conn = new
SqlConnection("您自己的DB链接字符串");

SqlDataReader dr = null;

SqlCommand cmd = new SqlCommand("select author
from test", Conn);

try

{

//== 第一,链接数据库。异步的用法只有在.NET
4.5(含)后续新版本

//旧的写法  Conn.Open();  
//---- 连结DB

await Conn.OpenAsync();

//== 第二,执行SQL指令。

//旧的写法   dr =
cmd.ExecuteReader();   //---- 执行SQL指令,取出数据

dr
await cmd.ExecuteReaderAsync(CommandBehavior.SequentialAccess);

//==第三,自由发挥,把执行后的结果呈现到画面上。

////==自己写循环==

//旧的写法  while (dr.Read())

while
(await dr.ReadAsync())

{

if
(await dr.IsDBNullAsync(1))
 // 1表示 true,DBNull

{

HttpContext.Current.Response.Write("*** NULL***");

}

else

{

HttpContext.Current.Response.Write(dr["author"] + "<br / >");

}

}

}

//......(未完)...后续的「关闭资源」程序代码没有改变,请参阅书本

关于 ADO.NET的程序范例可以参阅我以前的文章:

[ADO.NET] DataReader的标准范例 for ASP.NET (Code Behind版)

http://www.dotblogs.com.tw/mis2000lab/archive/2008/04/24/3446.aspx

或是我录制的教学影片:https://www.youtube.com/watch?v=zeXgLVqSy50

........................................................................................................................................................................

我们可以发现跟以前的差异

1. 程序代码更简单。拿旧的程序来修改,改变幅度极小。

2. 以前使用的Begin...方法与 End...方法都不见了,也没有写到 IAsyncResult

程序代码里面有用到 -- CommandBehavior.SequentialAccess

提供方法来让 DataReader 使用大型二进制值来处理含有数据行(字段)的数据列(记录)。SequentialAccess
并不会加载整个数据列,而是启用DataReader 来加载数据做为数据流。 然后您可以使用 .GetBytes()或
.GetChars()方法来指定要开始读取作业的字节位置和所传回数据的限制缓冲区大小。

当您指定 SequentialAccess 时,必须以数据行(字段)传回的顺序来读取它们,不过您不需要读取每一个数据行(字段)。
一旦您已经读取过在所传回数据流中的过去数据位置,则在该位置上和该位置之前的数据都无法再从DataReader 读取。 使用
OleDbDataReader 时,您可以重复读取目前的数据行(字段)值直到读取越过它为止。 使用
SqlDataReader时,您可以只读取数据行(字段)的值。

我的批注:上面划起来的重点,说明了
DataReader「向前顺向(Forward)、只读」的特性。可以参阅我录制的教学影片 -- https://www.youtube.com/watch?v=oY7jd0ABXeM

相关文章,请看:

[ADO.NET]
DataReader
的标准范例 for ASP.NET (Code
Behind
) #2
--
 CommandBehavior

http://www.dotblogs.com.tw/mis2000lab/archive/2010/12/01/datareader_2_commandbehavior.aspx

[MSDN] CommandBehavior
列举类型

http://msdn.microsoft.com/zh-tw/library/system.data.commandbehavior.aspx

........................................................................................................................................................................

这篇文章的范例最多,也最清楚:[msdn] 异步程序设计

http://msdn.microsoft.com/zh-tw/library/hh211418(v=vs.110).aspx

微软 msdn有很多解说&程序代码范例

使用
Async
Await
设计异步程序 (C#
Visual Basic)

http://msdn.microsoft.com/zh-tw/library/hh191443.aspx

逐步解说:使用 Async
Await 存取
Web (C#
Visual Basic)

http://msdn.microsoft.com/zh-tw/library/hh300224.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1

Using SqlDataReader’s new async methods in .Net 4.5,
Part 2: Examples

http://blogs.msdn.com/b/adonet/archive/2012/07/15/using-sqldatareader-s-new-async-methods-in-net-4-5-beta-part-2-examples.aspx

我另外也参考了这本书(简体中文版),书很薄,但写的很不错。

[.NET 4.5] ADO.NET / ASP.NET 使用 Async 和 Await 异步 存取数据库,布布扣,bubuko.com

时间: 2024-12-29 23:19:25

[.NET 4.5] ADO.NET / ASP.NET 使用 Async 和 Await 异步 存取数据库的相关文章

ASP基础教程:ADO存取数据库时如何分页显示

<动态网站设计十八般武艺 --ASP 篇>一文从第一期至今已和朋友们一起度过了大半个年头,相信通过在这一段时间中的学习.实践到再学习.再实践,大家已经能够熟练运用 ASP 的内建对象. ActiveX 组件去编写一些基本的 ASP 应用程序.从我收到的朋友们的来信中可以明显的感觉到,大家的 ASP 功力正不断地提升.最近很多朋友来信希望我写一些 ASP 在现实运用中的实例.因此,从本期开始我决定将<动态网站设计十八般武艺 --ASP 篇>的定位从介绍和学习 ASP 基础知识转向到

asp数据库编程:ADO 存取数据库时如何分页显示

∈裁词?ADO 存取数据库时的分页显示?如果你使用过目前众多网站上的电子公告板程序的话,那你应该会知道电子公告板程序为了提高页面的读取速度,一般不会将所有的帖子全部在一页中罗列出来,而是将其分成多页显示,每页显示一定数目的帖子数,譬如 20 条.想不想了解如何实现分页显示?请看本文! <动态网站设计十八般武艺 --ASP 篇>一文从第一期至今已和朋友们一起度过了大半个年头,相信通过在这一段时间中的学习.实践到再学习.再实践,大家已经能够熟练运用 ASP 的内建对象. ActiveX 组件去编写

封装WebService的APM为Async、Await模式利于Asp.Net页面调用

Wcf针对Async.Await指令直接可以返回Task<T>结果,但是老旧的系统中还是会有很多是在用Soap的Webservice.直接在Asp.Net页面调用APM方法确实比较麻烦,其实可以直接用TaskFactory封装APM模式为.Net4.5的async await模式,便于页面调用. 下面上实现代码,不多废话,注意注释: using System; using System.Collections.Generic; using System.Linq; using System.T

ASP.NET上传文件并记录到数据库

ASP.NET上传文件并记录到数据库 (2011-07-19 11:02:07) 转载▼ 标签: 杂谈 分类: asp.net学习 using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebC

ASP.NET MVC什么时候使用异步Action

在没有使用异步Action之前,在Action内,比如有如下的写法: public ActionResult Index() { CustomerHelper cHelper = new CustomerHelper(); List<Customer> result = cHelper.GetCustomerData(); return View(result); } 以上,假设,GetCustomerData方法是调用第三方的服务,整个过程都是同步的,大致是: →请求来到Index这个Act

用ASP.NET MVC5 +SQLSERVER2014搭建多层架构的数据库管理系统

用http://ASP.NET MVC5 +SQLSERVER2014搭建多层架构的数据库管理系统 背景:前段时间,给一家公司做外包(就是图标是朵菊花那家).为了尽快实现交付,网上四处寻找适合中小型企业框架.花了几天无果,只在github上找了个(貌似作者还要收费),把前端半改造,后端彻底改造(最终版本全部没有使用github的代码).现在,把这段时间的成果最初版本贡献出来.若是有类似需求的同学,尽可拿去用,不清楚的可以留言. 本人认为:除非是定制的软件和定价了的软件可以收费外,开源的都应该免费

asp.net 从Excel表导入数据到数据库中

http://www.cnblogs.com/hfzsjz/archive/2010/12/31/1922901.html http://hi.baidu.com/ctguyg/item/ebc857e90e436ae1fb42ba01 1 <form action="" method="post" runat ="server"> 2 <div> 3 <span>请选择文件:</span><

ASP.NET web 程序中使用Sqlite嵌入式数据库(相对路径)

string sqliteFilePath = Server.MapPath("~/App_Data/SQLite数据库名"); //这个文件是预先生成的数据库文件 SQLiteConnection conn = new SQLiteConnection("Data Source=" + sqliteFilePath);//声明一个SQLite数据库的链接 conn.Open();//打开数据库 当然,在这之前要先添加引用 System.Data.SQLite.dl

asp.net利用log4net写入日志到SqlServer数据库

asp.net利用log4net写入日志到SqlServer数据库 作者: Kein  来源: 博客园  发布时间: 2010-10-14 07:19  阅读: 6427 次  推荐: 6   原文链接   [收藏] 摘要:Log4net是一个开源的错误日志记录项目,asp.net利用log4net写入日志到SqlServer数据库.下面就我的安装部署log4net到MS sql server的经验与大家分享. asp.net利用log4net写入日志到SqlServer数据库,Log4net是