Мои выходные параметры всегда равны нулю, когда я использую BeginExecuteNonQuery
У меня есть хранимая процедура, которая возвращает varchar(160) в качестве выходного параметра хранимой процедуры.
Все работает нормально, когда я использую ExecuteNonQuery, я всегда получаю ожидаемое значение.
Однако, как только я переключаюсь на использование BeginExecuteNonQuery, я получаю нулевое значение для вывода.
Я использую connString + "Asynchronous Processing=true;" в обоих случаях.
К сожалению, BeginExecuteNonQuery примерно в 1,5 раза быстрее в моем случае... но мне действительно нужен выходной параметр.
Спасибо!
РЕДАКТИРОВАТЬ: Вот как я обрабатываю обратный вызов BeginExecuteNonQuery (я использую.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)
2 ответа
Если вы используете BeginExecuteNonQuery, ваш код не ожидает выполнения запроса, прежде чем продолжить, поэтому у вас нет выходного параметра. Чтобы получить параметр out, необходимо указать делегат AsyncCallback, который запускается после завершения запроса. Также вы уверены, что BeginExecuteNonQuery действительно быстрее и что ощутимое увеличение производительности происходит не только потому, что процесс просто не ожидает выполнения запроса. Смысл асинхронных запросов заключается в том, что вы хотите запустить длительный процесс обработки, например, чтобы создать сложный отчет, а затем сделать что-то позднее, когда он будет завершен, например, отправить электронное письмо пользователю, чтобы сообщить ему, что его отчет обработан.
Когда вы используете 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
правда.
Обратите внимание, что это всего лишь пример из документации, реальное использование асинхронных функций - позволить остальной части вашего приложения (например, вашему пользовательскому интерфейсу) продолжать функционировать, пока выполняется длинный запрос.