2014-09-01 35 views
1

我需要做一個相對簡單的事務,但是這會影響5-6個表,所以我通過了幾個關於如何做到這一點的教程,因爲我之前從未使用過事務,我eneded了在using(...)塊包裝每一個新的查詢是這樣的:在ADO.NET事務中使用using()塊

SqlTransaction transaction = null; 
SqlConnection connection = null; 
string localConnString =System.Web.Configuration.WebConfigurationManager..; 
try 
{ 
    connection = new SqlConnection(localConnString); 
    connection.Open(); 

    string insertSomeValues = "some SQL INSERT query".. 
    using (SqlCommand command = new SqlCommand(insertSomeValues, connection)) 
    { 
    .. 
    } 
    using(SqlCommand newCommand = new SqlCommand(otherQuery, connection)) 
    { 
    .. 
    } 
    transaction.Commit(); 
} 
catch 
{ 
    transaction.Rollback(); 
} 
finally 
{ 
    connection.Close(); 
} 

所以,我希望你有這個想法。我認爲這個實現存在的問題是,由於using塊在塊中,如果在此過程中引發異常,其他代碼仍將被執行,更重要的是transaction.Commit();。這使得事務無用,因爲當我想要一個事務(全部或全部)時,我最終得到部分更改database

由於我對這個話題缺乏經驗,我想知道怎樣正確處理這種情況。在其中一個例子有一個bool標誌,指示當前操作如何去,並呼籲transaction.Commit();之前有某種形式的檢查:

if (!hasErrors) 
{ 
    transaction.Commit(); 
} 

,但因爲我,包括我的交易serveral的表,我有一些查詢用於獲取信息或檢查某些內容,使用標誌的想法並不是很誘人。我正在考慮刪除using()塊,以便每當發生錯誤時(至少我認爲這是應該發生的),我直接進入主catch塊。所以......有一些想法,但處理這個問題的實際方法是什麼?

回答

0

我已經修改了所有命令的公共事務的ur代碼。

SqlTransaction transaction = null; 
SqlConnection connection = null; 

string localConnString =System.Web.Configuration.WebConfigurationManager..; 
try 
{ 
connection = new SqlConnection(localConnString); 
connection.Open(); 
transaction=connection.BeginTransaction(); 
string insertSomeValues = "some SQL INSERT query".. 
using (SqlCommand command = new SqlCommand(insertSomeValues, connection,transaction)) 
{ 
    .. 
} 
using(SqlCommand newCommand = new SqlCommand(otherQuery, connection,transaction)) 
{ 
    .. 
} 
transaction.Commit(); 
    } 
    catch 
{ 
    transaction.Rollback(); 
    } 
    finally 
    { 
    connection.Close(); 
    }