2010-07-20 7 views
14

Est-il possible de appeler une procédure stockée SQL Server de manière asynchrone via C#?Appel asynchrone d'une procédure stockée SQL Server dans C#

J'ai une procédure stockée qui écrit une sauvegarde d'une base de données spécifique (cela peut prendre beaucoup de temps) et je veux montrer la progression du processus de sauvegarde dans un formulaire Windows (pour cela j'utilise http://www.wisesoft.co.uk/articles/tsql_backup_restore_progress.aspx). Ou devrais-je utiliser le contrôle Backgroundworker et exécuter le SP dans un jobjob (propre thread)?

Répondre

0

Je l'aurais fait dans un fil séparé de toute façon, donc j'irais probablement pour l'approche BackgroundWorker.

12

Dans votre SqlCommand, vous pouvez exécuter des commandes de manière asynchrone à l'aide de BeginExecuteNonQuery et EndExecuteNonQuery. Ce dernier bloquera jusqu'à ce qu'il soit fait. Cependant, cela ne rapportera pas la progression du serveur sur la façon dont la sauvegarde va - j'utiliserais une barre de progression de sélection pour cela. Pour éviter que le EndExecuteNonQuery ne bloque votre interface utilisateur (en fonction de la façon dont vous la gérez), vous aurez besoin d'un fil d'arrière-plan. Si vous l'utilisez, alors vous pouvez également ne pas utiliser les méthodes BeginXXXEndXXX et le faire de manière synchrone sur un thread d'arrière-plan - le BackgroundWorker est le meilleur pour cela.

Pour éviter d'utiliser un fil d'arrière-plan dans l'interface utilisateur, au lieu de bloquer sur EndXXX vous devez enregistrer un rappel et gérer l'événement résultant (appelant EndXXX dans ce gestionnaire d'événements, mais il retournera immédiatement).

Mise à jour: selon un commentaire, pour les appels asynchrones dans la substance commande SQL/connexion, vous devez spécifier autant dans la chaîne de connexion:

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

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

Ou dans le code en utilisant le générateur de chaîne de connexion:

builder.AsynchronousProcessing = true; 
+1

Et vous devez définir builder.AsynchronousProcessing = true; dans le générateur de chaîne de connexion. –

+0

@Quandary +1 merci pour la mise à jour - réponse modifiée pour convenir. –

Questions connexes