SQL Server2008: проблема BeginExecuteNonQuery / EndExecuteNonQuery - PullRequest
5 голосов
/ 03 августа 2010

У меня есть хранимая процедура , которая записывает резервную копию определенной базы данных. Я называю этот SP в приложении C # / Windows Forms асинхронно. Вот фрагмент кода:

IAsyncResult result = command.BeginExecuteNonQuery();
while (!result.IsCompleted)
{
     System.Threading.Thread.Sleep(1000);
     ...
}
command.EndExecuteNonQuery(result));

Через некоторое время программа выходит из цикла, потому что IsCompleted = true и вызывает EndExecuteNonQuery. Проблема в том, что задание все еще занято и EndExecuteNonQuery заблокировано ! Это приводит к превышению времени ожидания сервера через несколько минут. Кажется, что значение IsCompleted не соответствует, соответственно, что не так с IsCompleted ? Как мне добиться, чтобы моя программа распознала «статус реальной работы» ?

1 Ответ

3 голосов
/ 03 августа 2010

Убедитесь, что ваша хранимая процедура ничего не печатает и не имеет отчетов о подсчете (SET NOCOUNT ON). Асинхронные вызовы TDS перезванивают на самый первый пакет, отправленный сервером, но этот пакет может быть промежуточным результатом (как в 1 row updated) и происходить задолго до фактического завершения. Это отстой? Да. Вы можете что-нибудь с этим сделать? Нет.

В качестве примечания: гораздо эффективнее просто передать обратный вызов в BeginExecute (...):

// Set form's state to 'executing', 
// eg. Button.Enabled = false; label.Text = 'Executing';
command.BeginExecuteNonQuery((asyncstate)=>
{
   try
   {
      command.EndExecuteNotQuery();
   }
   catch(SqlException ex)
   {
     ...
   } 
   // Reset the form's state to 'Ready'
   Invoke (()=>
   {
     // eg. Button.Enabled = true; label.Text = 'Ready';
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...