Мои выходные параметры всегда равны нулю, когда я использую 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 правда.

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

Другие вопросы по тегам