2016-03-16 68 views
4

我在創建了一段代碼之後,我嘗試從事務中的c#發出一個異步SQL調用,例如我可能正在更新或刪除表。ExecuteNonQueryAsync並在SQL事務中提交

這是我到目前爲止,但我似乎無法找到關於在一個事務中這樣做的很多信息,從我在這裏和我瞭解到目前爲止,我相信它可能會嘗試在事務之前提交事務如果命令很耗時,命令已經完全完成。如果你能建議/指出我的例子,我會非常感激。

var sqlQuery = "delete from table"; 
     using (var connection = new SqlConnection(ConnectionString)) 
     { 
      await connection.OpenAsync(); 
      using (var tran = connection.BeginTransaction()) 
      { 
       using (var command = new SqlCommand(sqlQuery, connection, tran)) 
       { 
        await command.ExecuteNonQueryAsync(); 
        tran.Commit(); 
       } 
      } 
     } 

感謝,

+0

@Igor感謝您的幫助,該方法實際上是從一個不同的類被包裹在一個try catch中調用 - 對不起,我應該在我的帖子中提到。 –

+1

良好的交易。你仍然需要一個對創建的'SqlTransaction'的引用,儘管你可以在代碼中執行'tran.RollBack()'(見下面的答案),調用代碼沒有意義,除非這是一個較小的樣本數據庫抽象包裝什麼的。 – Igor

+1

@Igor好的大喊,謝謝你的回答 –

回答

5

您的代碼看起來不錯。我只是在執行該命令時添加了try/catch,以便在事務失敗時回滾事務。由於您在行await command.ExecuteNonQueryAsync();上使用await關鍵字,因此執行將會阻塞,直到方法返回而不考慮需要多長時間(除非您從命令本身獲取超時異常,在這種情況下,應該將命令的執行超時設置得更高,或者找出原因它採取這麼久)。

var sqlQuery = "delete from table"; 
    using (var connection = new SqlConnection(ConnectionString)) 
    { 
     await connection.OpenAsync(); 
     using (var tran = connection.BeginTransaction()) 
     { 
      using (var command = new SqlCommand(sqlQuery, connection, tran)) 
      { 
       try { 
        await command.ExecuteNonQueryAsync(); 
       } catch(Exception){ 
        tran.Rollback(); 
        throw; 
       } 
       tran.Commit(); 
      } 
     } 
    }