Domanda

Ho una procedura immagazzinata che restituisce un varchar (160) come un parametro di output di una stored procedure.

Tutto funziona bene quando uso ExecuteNonQuery, ho sempre arrivare di nuovo il valore atteso.

Tuttavia, una volta che i passare utilizzare BeginExecuteNonQuery, ottengo un valore nullo per l'uscita.

Sto usando connString + "Asynchronous Processing = true;" in entrambi i casi.

Purtroppo il BeginExecuteNonQuery è di circa 1,5 volte più veloce nel mio caso ... ma ho davvero bisogno del parametro di uscita.

Grazie!

EDIT: Questo è come io sono l'elaborazione del callback BeginExecuteNonQuery (sto 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)
È stato utile?

Soluzione

Se si utilizza BeginExecuteNonQuery il codice non aspettare che la query da eseguire prima di continuare, che è il motivo per cui non si ha il parametro di uscita. Al fine di recuperare il parametro di è necessario specificare un delegato AsyncCallback che funziona quando la query ha terminato l'esecuzione. Inoltre sono sicuro che BeginExecuteNonQuery è davvero più veloce e che l'aumento delle prestazioni percepite non è solo perché il processo non è solo in attesa per la query da eseguire. Il punto di query asincrone è dove si desidera il fuoco fuori una lunga po 'di elaborazione tale da produrre un rapporto complesso, poi fare qualcosa in seguito, una volta che è completo, per esempio e-mail che l'utente per dire loro il loro rapporto è stato elaborato.

Altri suggerimenti

Quando si utilizza BeginExecuteNonQuery i interrogazione viene eseguita in background, e il codice continua a funzionare. Che cosa sta accadendo è che probabilmente si sta guardando il risultato prima che la query ha terminato l'esecuzione. Questo è da l'aiuto di MSDN per 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));

Quindi, il risultato è solo correttamente disponibile una volta IsCompleted è vero.

Si noti che questo è solo un esempio dalla documentazione, l'uso reale delle funzioni asincrone è quello di permettere il resto della tua app (ad es. L'interfaccia utente) di continuare a funzionare, mentre una lunga interrogazione è in esecuzione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top