C # & SQL Server: l’insertion / mise à jour ne s’exécute réellement que lors du débogage

J’ai une API plutôt simpliste pour l’ajout, puis la mise à jour ultérieure d’une petite table dans SQL Server. Il insérera (ou mettra à jour, ce qui présentera le même comportement étrange) lorsque j’entrerai dans mon code d’access aux données dans le débogueur, mais pas lorsque je passerai sur ce même code. J’ai sûrement manqué quelque chose d’évident …

int result = 0; const ssortingng sql = "INSERT into MyProgress (ImportJobId, SiteCode, ProcessedAmount, TotalToProcess, ErrorCount, CreatedDateTime, LastModifiedDateTime) " + "VALUES (@importJobId, @siteCode, @currentProgress, @totalPieces, 0, getdate(), getdate())"; using (var connection = GetSqlConnection()) using (var sqlCmd = GetSqlCommand(connection, sql)) { sqlCmd.Parameters.AddWithValue("@importJobId", importJobId); sqlCmd.Parameters.AddWithValue("@siteCode", siteCode); sqlCmd.Parameters.AddWithValue("@currentProgress", currentProgress); sqlCmd.Parameters.AddWithValue("@totalPieces", totalPieces); //SqlParameter outputParameter = new SqlParameter("@ID", SqlDbType.Int, 4); //outputParameter.Direction = ParameterDirection.InputOutput; //sqlCmd.Parameters.Add(outputParameter); sqlCmd.BeginExecuteNonQuery(); //result = (int) (outputParameter.Value ?? -1); } return result; 

Pour les curieux, GetSqlConnection() ressemble à ceci:

 SqlConnection connection = new SqlConnection(_ConnectionSsortingng); connection.Open(); return connection; 

BeginExecuteNonQuery() est une méthode asynchrone. Il reviendra immédiatement avant que la commande ne soit exécutée. Pour attendre la fin, utilisez la méthode EndExecuteNonQuery .

Lorsque vous appelez BeginExecuteNonQuery pour exécuter une instruction Transact-SQL, vous devez appeler EndExecuteNonQuery afin de terminer l’opération. Si le processus d’exécution de la commande n’est pas encore terminé, cette méthode est bloquée jusqu’à la fin de l’opération.

Il semble que vous cherchiez une méthode synchrone. Si c’est le cas, utilisez simplement

 sqlCmd.ExecuteNonQuery(); 

Celui-ci ne reviendra qu’après l’exécution de la commande.

Si vous souhaitez exécuter la commande de manière asynchrone, il est beaucoup plus facile d’utiliser la méthode ExecuteNonQueryAsync .

 await sqlCmd.ExecuteNonQueryAsync(); 

Notez que vous devrez rendre votre méthode async à utiliser. Vous avez également besoin de .NET 4.5+ pour l’utiliser.

Modifié pour corriger, en l’appelant par erreur, une méthode asynchrone – voir les commentaires.


Vous appelez la méthode BeginExecuteNonQuery qui initie une requête, mais vous devez appeler EndExecuteNonQuery pour terminer l’opération (généralement de manière asynchrone). Lorsque vous déboguez, cela a une chance de se terminer lorsque vous avancez manuellement. Lorsque vous passez le relais, la connexion est supprimée avant la fin.

Vous devrez soit mettre à jour votre code pour utiliser un modèle APM (Asynchronous Programming Model), soit appeler à la place l’ExecuteNonQuery synchrone.