Мои выходные параметры всегда нулевые, когда я использую BeginexEcutenQuery
-
04-10-2019 - |
Вопрос
У меня есть сохраненная процедура, которая возвращает 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 функций состоит в том, чтобы разрешить остальное приложение (например, ваш интерфейс), чтобы продолжать функционировать, в то время как длительный запрос работает.