C#和SQL Server:插入/更新只在调试时才真正执行

我有一个相当简单的API用于添加,然后在SQL Server中更新一个小表。 当我在调试器中插入我的数据访问代码时,它将插入(或更新,表现出相同的奇怪行为),但是当我跳过相同的代码时则不会。 当然,我错过了一些明显的东西……

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; 

好奇的是, GetSqlConnection()看起来像这样:

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

BeginExecuteNonQuery()是一个异步方法。 它将在执行命令之前立即返回。 要等待它完成,请使用EndExecuteNonQuery方法。

当您调用BeginExecuteNonQuery来执行Transact-SQL语句时,必须调用EndExecuteNonQuery才能完成操作。 如果执行命令的过程尚未完成,则此方法将阻塞,直到操作完成。

看来你正在寻找同步方法。 如果是这种情况,只需使用

 sqlCmd.ExecuteNonQuery(); 

只有在执行命令后才会返回此命令。

如果要异步执行命令,则使用ExecuteNonQueryAsync方法要容易得多。

 await sqlCmd.ExecuteNonQueryAsync(); 

请注意,您必须使方法async才能使用await 。 您还需要.NET 4.5+才能使用它。

编辑错误地将其称为异步方法 – 请参阅注释。


您正在调用BeginExecuteNonQuery方法来启动查询,但您必须调用EndExecuteNonQuery来完成操作(通常是异步)。 调试时,这有机会在您手动单步执行时完成。 当您跳过时,连接在完成之前处理。

您需要更新代码以使用异步编程模型( APM )模式或调用同步ExecuteNonQuery。