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

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

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

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

Я использую connString + "Асинхронная обработка = 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)

person Charles Okwuagwu    schedule 22.05.2010    source источник


Ответы (2)


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

person Ben Robinson    schedule 22.05.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 истинно.

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

person David_001    schedule 22.05.2010