Pregunta

Tengo un procedimiento almacenado que devuelve un varchar (160) como un parámetro de salida de un procedimiento almacenado.

Todo funciona bien cuando uso ExecuteNonQuery, siempre que vuelva el valor esperado.

Sin embargo, una vez que me cambio a utilizar BeginExecuteNonQuery, aparece un valor nulo para la salida.

Estoy utilizando connString + "Asynchronous Processing = true;" en ambos casos.

Por desgracia, el BeginExecuteNonQuery es aproximadamente 1,5 veces más rápido en mi caso ... pero realmente necesita el parámetro de salida.

Gracias!

EDIT: Esta es la forma en que estoy procesando la devolución de llamada BeginExecuteNonQuery (estoy usando .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)
¿Fue útil?

Solución

Si utiliza BeginExecuteNonQuery el código no esperar a que la consulta se ejecute antes de continuar, es por eso que no tiene el parámetro de salida. Con el fin de recuperar el parámetro de salida es necesario especificar un delegado AsyncCallback que se ejecuta cuando la consulta ha terminado de ejecutarse. También está usted seguro de que BeginExecuteNonQuery es realmente más rápido y que el aumento de rendimiento percibido no es sólo porque el proceso es simplemente no la espera de la consulta se ejecute. El punto de consultas asíncronas es donde desea llamas más allá de un largo poco de procesamiento, como para producir un informe complejo, a continuación, hacer algo más tarde, una vez que se ha completado, por ejemplo, un correo electrónico al usuario para decirles que su informe ha sido procesado.

Otros consejos

Cuando se utiliza BeginExecuteNonQuery La consulta se ejecuta en segundo plano, y su código continúa ejecutándose. Lo que está sucediendo es que probablemente usted está buscando en el resultado antes de la consulta ha terminado de ejecutarse. Esto es de la ayuda de MSDN para 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));

Así que el resultado sólo es adecuada disponible una vez IsCompleted es cierto.

Tenga en cuenta que esto es sólo un ejemplo de los documentos, el uso real de las funciones asíncronas es permitir que el resto de su aplicación (por ejemplo. La interfaz de usuario) para seguir funcionando mientras que una consulta larga se está ejecutando.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top