Долгосрочная хранимая процедура из ADO.NET или Classic ADO - PullRequest
1 голос
/ 19 января 2009

Предположим, что сохраненный процесс занимает 10 минут и не возвращает данных.

Как правильно вызвать хранимую процедуру в SQL Server, и ваш код не ждет результата? Есть ли способ справиться с этим из T-SQL или соединения? Что-то, что работает в ADO.NET и классическом ActiveX ADO?

Единственное, о чем я думал, это:
1) Создайте работу в вашем T-SQL
2) Загрузите код, основанный на T-SQL, на первый шаг задания
3) Убедитесь, что последняя строка вашего кода удаляет задание
4) Выполнить задание (я уверен, что это не заставит вас ждать ответа) Я знаю, что это очень плохо и хакерски ... но

Есть ли какой-то другой T-SQL, о котором я не думаю, что вы можете обернуть сохраненный процесс, чтобы сказать: «Я знаю, что ответа нет ... поэтому я решил не ждать».

Ответы [ 4 ]

8 голосов
/ 19 января 2009

Да, вы можете

  1. вызвать его асинхронно, используя SqlCommand.BeginExecuteNonQuery ()
  2. Или вызвать его асинхронно на делегат (будет использовать поток из пул потоков),
  3. или в отдельном потоке (создан себя)
  4. В классическом ADO используйте опцию параметр в открытом соединении Метод:

    oConnection.Open (,,, adAsyncConnect)

2 голосов
/ 19 января 2009

Для .Net попробуйте метод .BeginExecuteNonQuery() вашего SqlCommand объекта. Не уверен, как это будет работать с ActiveX ADO.

1 голос
/ 19 января 2009

Я бы расследовал переписывание любого SP, который занял бы столько времени, если только он не вносил изменения или вставлял очень большое количество записей. Если у вас есть sp, занимающий более 30 секунд от пользовательского интерфейса, я говорю, что у вас очень высока вероятность проблем с производительностью. Есть ли у рассматриваемого прока курсор? Если это так, вы, вероятно, можете уменьшить его до миллисекунд при правильной настройке производительности. Я хотел бы рассмотреть вопрос о настройке производительности, прежде чем делать обходной путь, чтобы пользовательский интерфейс работал без завершения процесса.

Вы говорите, что он не возвращает никаких записей, но что нужно знать пользователю в случае сбоя? Если они перейдут к чему-то другому, они будут думать, что оно успешно завершено.

0 голосов
/ 19 января 2009

Запустите его в отдельном потоке и просто дайте потоку умереть.

...