C # y SQL Server: la inserción / actualización solo se ejecuta de verdad al depurar

Tengo una API bastante simplista para agregar y luego actualizar una pequeña tabla en SQL Server. Se insertará (o actualizará, lo que exhibe el mismo comportamiento extraño) cuando paso a mi código de acceso a datos en el depurador, pero no cuando paso sobre ese mismo código. Seguramente, me he perdido algo obvio …

int result = 0; const string 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; 

Para los curiosos, GetSqlConnection() ve así:

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

BeginExecuteNonQuery() es un método asíncrono. Volverá inmediatamente, antes de que se ejecute el comando. Para esperar a que se complete, use el método EndExecuteNonQuery .

Cuando llama a BeginExecuteNonQuery para ejecutar una instrucción Transact-SQL, debe llamar a EndExecuteNonQuery para completar la operación. Si el proceso de ejecución del comando aún no ha finalizado, este método se bloquea hasta que se complete la operación.

Parece que estás buscando un método sincrónico. Si ese es el caso, simplemente use

 sqlCmd.ExecuteNonQuery(); 

Este regresará solo después de que se ejecute el comando.

Si desea ejecutar el comando de forma asíncrona, es mucho más fácil usar el método ExecuteNonQueryAsync .

 await sqlCmd.ExecuteNonQueryAsync(); 

Tenga en cuenta que tendrá que hacer que su método sea async para usar await . También necesitas .NET 4.5+ para usarlo.

Editado para corregir, llamando erróneamente a esto un método asíncrono: vea los comentarios.


Está llamando al método BeginExecuteNonQuery, que inicia una consulta, pero debe llamar a EndExecuteNonQuery para completar la operación (generalmente de forma asíncrona). Cuando depura, esto tiene una oportunidad de completarse a medida que avanza manualmente. Cuando se pasa, la conexión se elimina antes de completarse.

Necesitará actualizar su código para usar un patrón de Modelo de progtwigción asíncrono ( APM ) o llamar al ExecuteNonQuery síncrono en su lugar.