Мои выходные параметры всегда нулевые, когда я использую BeginexEcutenQuery

StackOverflow https://stackoverflow.com/questions/2887570

Вопрос

У меня есть сохраненная процедура, которая возвращает Varchar (160) в качестве выходного параметра сохраненной процедуры.

Все работает нормально, когда я использую Executennquery, я всегда возвращаю ожидаемое значение.

Однако, как только я переключаюсь, чтобы использовать BeginexEcutennquery, я получаю нулевое значение для вывода.

Я использую консервную + "асинхронную обработку = true;" в обоих случаях.

К сожалению, BeginexEcutenquery - это примерно в 1,5 раза быстрее в моем случае ... но мне действительно нужен выходной параметр.

Спасибо!

Редактировать: Вот как я обработаю обратный вызов BegineXecutenQuery (я использую .NET 4.0 ...)

    Dim resp as String=""
    cmd.BeginExecuteNonQuery(Sub(result As IAsyncResult)
                                 Dim c As SqlCommand = Nothing
                                 Try
                                     c = CType(result.AsyncState, SqlCommand)
                                     c.EndExecuteNonQuery(result)
                                     **resp = CStr(c.Parameters("@response").Value)**
                                 Catch ex As Exception
                                     WriteLog("ERR - LogRequest - " & ex.Message)
                                 Finally
                                     c.Connection.Close()
                                     c.Dispose()
                                 End Try
                             End Sub, cmd)
Это было полезно?

Решение

Если вы используете BeginexecutenAnquery, ваш код не ждет, пока запрос выполняется, прежде чем продолжить, поэтому у вас нет выходного параметра. Чтобы получить параметр OUT, вам необходимо указать делегат Asyncallback, который работает при завершении запроса. Также вы уверены, что BeginexecutenQuery действительно быстрее, и что воспринимаемая производительность увеличивается не только потому, что процесс просто не ожидает выполнения запроса. Точка async-запросов - это то, где вы хотите отстрелить длинную обработку, например, для создания сложного отчета, то сделайте что-то позже, как только он будет завершен, например, по электронной почте пользователю, чтобы сказать им, что их отчет был обработан.

Другие советы

Когда вы используете BeginExecuteNonQuery Запрос проходит на заднем плане, и ваш код продолжает работать. Что, вероятно, происходит, что вы смотрите на результат до того, как запрос завершит выполнение. Это из помощи MSDN для BeginExecuteNonQuery:

IAsyncResult result = command.BeginExecuteNonQuery();
while (!result.IsCompleted)
{
    Console.WriteLine("Waiting ({0})", count++);
    // Wait for 1/10 second, so the counter
    // does not consume all available resources 
    // on the main thread.
    System.Threading.Thread.Sleep(100);
}
Console.WriteLine("Command complete. Affected {0} rows.", 
     command.EndExecuteNonQuery(result));

Так что результат правильно доступен один раз IsCompleted правда.

Обратите внимание, что это просто пример от документов, реальное использование ASYNC функций состоит в том, чтобы разрешить остальное приложение (например, ваш интерфейс), чтобы продолжать функционировать, в то время как длительный запрос работает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top