Альтернативы для заданий SqlCommand.BeginExecuteNonQuery или SQL?(для асинхронного вызова хранимой процедуры с веб-страницы asp.net) - PullRequest
0 голосов
/ 13 ноября 2011

Цель: Вызов очень медленной хранимой процедуры (с параметрами) асинхронно из кода за веб-страницей asp.net с помощью одного вызова функции, а затем забывание об этом.

Примечания: Я попытался использовать SqlCommand.BeginExecuteNonQuery без вызова SqlCommand.EndExecuteNonQuery (см. Код ниже), но хранимая процедура не запустилась.(Я использовал крошечную хранимую процедуру для обновления одного поля таблицы для тестирования, но поле не было обновлено. Оно обновляется, когда я использую SqlCommand.ExecuteNonQuery).

Мне это не интересно и я не знаюкогда хранимая процедура закончится.(Поэтому я не могу дождаться, пока он завершит вызов SqlCommand.EndExecuteNonQuery.)

Ситуация: После некоторых исследований я обнаружил, что для этой цели можно использовать задания sql.И для параметров sp;Я могу хранить их в таблице, а затем sp может прочитать их.Однако я не знаю, является ли это правильным подходом к моей проблеме (я новичок в мире SQL).Я надеюсь, что вы можете прокомментировать использование задания sql для этой цели или предложить альтернативы.Спасибо.

Код:

    using (SqlConnection connection = new SqlConnection(
        @"Data Source=XXX\MSSQL2008R2;Initial Catalog=YYY;Integrated Security=True"
        + ";Asynchronous Processing=true"))
    {
        connection.Open();
        SqlCommand cmd = new SqlCommand("spTestProcedure", connection);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add(new SqlParameter("@pText", DateTime.Now.ToString()));
        cmd.BeginExecuteNonQuery(); //Doesn't work.
        //cmd.ExecuteNonQuery(); // This works.
    }

Ответы [ 3 ]

0 голосов
/ 13 ноября 2011

Например, используйте ThreadPool для вызова синхронизации в отдельном потоке.

Это будет выглядеть примерно так ...

Метод извлечения:

private void ExecuteCommandSync()
{
    using (SqlConnection connection = new SqlConnection( 
        @"Data Source=XXX\MSSQL2008R2;Initial Catalog=YYY;Integrated Security=True" 
        + ";Asynchronous Processing=true")) 
    { 
        connection.Open(); 
        SqlCommand cmd = new SqlCommand("spTestProcedure", connection); 
        cmd.CommandType = CommandType.StoredProcedure; 
        cmd.Parameters.Add(new SqlParameter("@pText", DateTime.Now.ToString())); 
        cmd.ExecuteNonQuery(); 
    }
}

Измените ваш код:

ThreadPool.QueueUserWorkItem((x) => { ExecuteCommandSync(); });

Он выполнит синхронный вызов некоторого потока из ThreadPool, как только это будет сделано - он закроет соединение, и вы сделали,Это не ЛУЧШЕЕ решение с точки зрения производительности, поскольку у вас будет спящий поток, пока он ожидает Stored Proc, но он достаточно хорош и будет делать то, что вы хотите.

0 голосов
/ 16 ноября 2011

Я искал способ сделать это из кода на asp.net, но понял, что нет простого способа сделать это (я не хотел думать о проблемах с соединением или тайм-аутом).Я закончил тем, что делал это через веб-сервис.

  1. Из кода asp.net я вызываю функцию своего веб-сервиса синхронно.
  2. В функции веб-сервиса я вызываю сохраненныйпроцедура асинхронно с использованием SqlCommand.BeginexecuteNonQuery(AsyncCallback, Object).
  3. Обратный вызов обрабатывается в веб-службе (для обработки ошибок).

Следовательно, моя веб-страница продолжает работать так, как нужноЯ хочу: один раз выполнить запрос, а затем забыть об этом.

0 голосов
/ 13 ноября 2011

Я думаю, вы должны просто выполнить свой sp в отдельном потоке.

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...