C#中SQL Server存储过程的异步调用

时间:2010-07-20 08:40:01

标签: c# sql-server tsql ado.net asynchronous

是否可以通过C#异步调用SQL Server存储过程

我有一个写入特定数据库备份的存储过程(这可能需要很长时间才能完成),我想在Windows窗体中显示备份过程的进度(为此我使用{{3} })。或者我应该使用Backgroundworker控件并在backgroundjob(自己的线程)中运行SP?

3 个答案:

答案 0 :(得分:12)

SqlCommand中,您可以使用BeginExecuteNonQueryEndExecuteNonQuery异步运行命令。后者将阻止直到完成。但是,这不会报告服务器有关备份的进展情况 - 我会使用选取框进度条。

为避免EndExecuteNonQuery阻止你的UI(取决于你如何处理它),你需要一个后台线程。如果您使用此方法,那么您也可以不使用BeginXXX EndXXX方法并在后台线程上同步执行 - BackgroundWorker最适用于此。

为避免在UI中使用后台线程,而不是在EndXXX上阻塞,您需要注册一个回调并处理结果事件(在此事件处理程序中调用EndXXX,但它将返回立即)。

更新:根据评论,对于SQL命令/连接内容的异步调用,您需要在连接字符串中指定尽可能多的内容:

http://www.connectionstrings.com/sql-server-2008

Server=myServerAddress; Database=myDataBase; Integrated Security=True; Asynchronous Processing=True;

或者在使用连接字符串构建器的代码中:

builder.AsynchronousProcessing = true;

答案 1 :(得分:2)

答案 2 :(得分:0)

无论如何,我会在一个单独的线程中完成它,所以我可能会采用BackgroundWorker方法。