2010-10-21 2 views
0

Le code que j'écris copie les données d'une table à une autre. Il est possible que la requête puisse s'exécuter pendant longtemps, donc j'effectue une requête asynchrone et en attendant je compte sur la table de destination pour fournir une mise à jour du statut.L'exécution d'une requête SQL en attente d'une opération asynchrone génère une exception

La requête qui fait le compte devient le message d'exception suivante ...

L'exécution de la commande ne peut pas continuer en raison d'une opération asynchrone en attente déjà en cours.

Donc clairement ce que je fais n'est pas autorisé. Alors, quelles sont les règles pour les opérations SQL asynchrones? Existe-t-il un autre moyen d'obtenir le statut de l'opération en attente?

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(_connectionString); 
builder.AsynchronousProcessing = true; 

using(SqlConnection connection = new SqlConnection(builder.ConnectionString)) 
{ 
    connection.Open(); 

    SqlCommand command = new SqlCommand(); 
    command.Connection = connection; 
    command.CommandType = System.Data.CommandType.Text; 
    command.CommandText = "INSERT INTO DestTable SELECT * FROM SourceTable"; 

    IAsyncResult result = command.BeginExecuteNonQuery(); 

    using(SqlConnection statusConnection = new SqlConnection(_connectionString)) 
    { 
     while(!result.IsCompleted) 
     { 
      SqlCommand statusCommand = new SqlCommand(); 
      statusCommand.Connection = statusConnection; 
      statusCommand.CommandType = System.Data.CommandType.Text; 
      statusCommand.CommandText = "SELECT COUNT(*) FROM DestTable"; 

      int currentRowCount = (int)command.ExecuteScalar(); 

      Thread.Sleep(500); 
     } 

     command.EndExecuteNonQuery(result); 
    } 
} 
+0

Veuillez marquer cette question avec le produit de base de données que vous utilisez (Oracle, SQL Server, etc.). –

Répondre

2

Il semble que vous essayez d'utiliser la même commande.

Je pense que vous voulez remplacer

int currentRowCount = (int)command.ExecuteScalar(); 

avec

int currentRowCount = (int)statusCommand.ExecuteScalar(); 

Vous essayez d'utiliser la même déclaration, qui devrait être bloqué en raison de la première exécution.

+0

Merci d'avoir remarqué cela. –

Questions connexes