Асинхронный вызов хранимой процедуры SQL Server в С#

Можно ли выполнить асинхронное вызов хранимой процедуры SQL Server через С#?

У меня есть хранимая процедура, которая записывает резервную копию конкретной базы данных (это может занять много времени), и я хочу показать ход процесса резервного копирования в виде окон (для этого я использую http://www.wisesoft.co.uk/articles/tsql_backup_restore_progress.aspx). Или я должен использовать элемент управления Backgroundworker и запускать SP в backgroundjob (собственный поток)?

Ответы

Ответ 1

В SqlCommand вы можете запускать команды асинхронно с помощью BeginExecuteNonQuery и EndExecuteNonQuery. Последний будет блокироваться до его завершения. Однако это не будет сообщать о прогрессе с сервера о том, как происходит резервное копирование - я бы использовал для него индикатор выполнения marquee.

Чтобы не блокировать EndExecuteNonQuery ваш пользовательский интерфейс (в зависимости от того, как вы его обрабатываете), вам понадобится фоновый поток. Если вы используете это, вы также можете не использовать методы BeginXXX EndXXX и делать это синхронно в фоновом потоке - лучше всего подходит BackgroundWorker.

Чтобы избежать использования фонового потока в пользовательском интерфейсе, вместо блокировки на EndXXX вам необходимо зарегистрировать обратный вызов и обработать результирующее событие (вызов EndXXX в этом обработчике событий, но он немедленно вернется).

Обновление: в соответствии с комментарием, для асинхронных вызовов в команде SQL/соединение, вам нужно указать столько же в строке соединения:

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

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

Или в коде с использованием построителя строк подключения:

builder.AsynchronousProcessing = true;

Ответ 3

Я бы сделал это в отдельном потоке, так что я, вероятно, подойду для подхода BackgroundWorker.