2010-07-20 15 views
14

¿Es posible llamar a un procedimiento almacenado de SQL Server de forma asíncrona a través de C#?Llamada asincrónica de un procedimiento almacenado de SQL Server en C#

Tengo un procedimiento almacenado que escribe una copia de seguridad de una base de datos específica (esto puede llevar mucho tiempo) y quiero mostrar el progreso del proceso de copia de seguridad en formularios de Windows (para esto uso http://www.wisesoft.co.uk/articles/tsql_backup_restore_progress.aspx). ¿O debería usar el control Backgroundworker y ejecutar el SP en un backgroundjob (propio hilo)?

Respuesta

0

Lo habría hecho en una hebra separada de todos modos, así que probablemente optaría por el enfoque de BackgroundWorker.

12

En su SqlCommand puede ejecutar comandos de forma asincrónica utilizando BeginExecuteNonQuery y EndExecuteNonQuery. Este último bloqueará hasta que esté hecho. Sin embargo, esto no informará el progreso del servidor sobre cómo va la copia de seguridad. Utilizaría una barra de progreso de marquesina para ello.

Para evitar que el EndExecuteNonQuery bloquee su IU (dependiendo de cómo lo maneje), necesitará un hilo de fondo. Si usa esto, entonces también puede no utilizar los métodos BeginXXXEndXXX y hacerlo de forma síncrona en un subproceso en segundo plano: el BackgroundWorker es el mejor para esto.

evitar el uso de un subproceso de fondo en la interfaz de usuario, en lugar de bloquear el EndXXX tendrá que registrar una devolución de llamada y controlar el evento resultante (llamando EndXXX en este controlador de eventos, pero volverá inmediatamente).

Actualización: según un comentario, para las llamadas asincrónicas en la materia de comandos SQL/conexión, es necesario que especifique tanto en la cadena de conexión:

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

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

o en el código utilizando el generador de cadenas de conexión:

builder.AsynchronousProcessing = true; 
+1

y hay que establecer builder.AsynchronousProcessing = true; en el generador de cadenas de conexión. –

+0

@Quandary +1 gracias por la actualización - respuesta modificada para adaptarse. –

Cuestiones relacionadas