мои выходные параметры всегда равны нулю, когда я использую BeginExecuteNonQuery - PullRequest
2 голосов
/ 22 мая 2010

У меня есть хранимая процедура, которая возвращает 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 ]

2 голосов
/ 22 мая 2010

Когда вы используете 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 истинно.

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

1 голос
/ 22 мая 2010

Если вы используете BeginExecuteNonQuery, ваш код не ожидает выполнения запроса, прежде чем продолжить, поэтому у вас нет выходного параметра. Чтобы получить параметр out, необходимо указать делегат AsyncCallback, который запускается после завершения запроса. Также вы уверены, что BeginExecuteNonQuery действительно быстрее и что ощутимое увеличение производительности происходит не только потому, что процесс просто не ожидает выполнения запроса. Смысл асинхронных запросов заключается в том, что вы хотите запустить длительный процесс обработки, например, чтобы создать сложный отчет, а затем сделать что-то позже, как только он будет завершен, например, напишите пользователю, чтобы сообщить ему, что его отчет обработан.

...