Question

I ai une procédure stockée qui renvoie un varchar (160) en tant que paramètre de sortie d'une procédure stockée.

Tout fonctionne très bien quand je l'utilise ExecuteNonQuery, je reçois toujours revenir à la valeur attendue.

Cependant, une fois que je passe à utiliser BeginExecuteNonQuery, je reçois une valeur nulle pour la sortie.

J'utilise connString + "traitement asynchrone = true;" dans les deux cas.

Malheureusement, la BeginExecuteNonQuery est d'environ 1,5 fois plus rapide dans mon cas ... mais je l'ai vraiment besoin du paramètre de sortie.

Merci!

EDIT: Voici comment je suis en train de traiter le rappel BeginExecuteNonQuery (je suis en utilisant .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)
Était-ce utile?

La solution

Si vous utilisez BeginExecuteNonQuery votre code n'attendez pas pour la requête à exécuter avant de continuer, c'est la raison pour laquelle vous n'avez pas le paramètre de sortie. Pour récupérer le paramètre out, vous devez spécifier un délégué AsyncCallback qui fonctionne lorsque la requête a terminé son exécution. Aussi êtes-vous sûr que BeginExecuteNonQuery est vraiment plus rapide et que l'augmentation de la performance perçue est non seulement parce que le processus est en attente tout simplement pas pour la requête à exécuter. Le point de requêtes Async est l'endroit où vous voulez mettre le feu outre un long morceau de traitement de nature à produire un rapport complexe, puis faire quelque chose plus tard, une fois qu'il est terminé, par exemple envoyer un courriel à l'utilisateur de leur dire leur rapport a été traité.

Autres conseils

Lorsque vous utilisez BeginExecuteNonQuery les pistes de requête en arrière-plan, et votre code continue à fonctionner. Ce qui est probablement passe est que vous êtes à la recherche du résultat avant que la requête a terminé son exécution. Ceci est de l'aide msdn pour 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));

Ainsi, le résultat est que correctement disponible une fois IsCompleted est vrai.

Notez que ceci est juste un exemple de la documentation, l'utilisation réelle des fonctions async est de permettre au reste de votre application (par exemple. Votre interface utilisateur) de continuer à fonctionner pendant une longue requête est en cours d'exécution.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top