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。