2011-11-11 25 views
0

大家好我寫了下面的交易中插入數據,但是當我得到一個例外僅拿到例外而不是插入到數據庫其餘所有插入的數據任何一個可以告訴什麼錯在我的交易

這是我寫的

public bool addWhole(SqlTransaction osqlTrans) 
{ 
    m_flag = false; 
    osqlTrans = null; 

    SqlConnection osqlCon = new SqlConnection(constr); 

    if (osqlCon.State != ConnectionState.Open) 
    { 
     osqlCon.Open(); 
    } 

    osqlTrans = osqlCon.BeginTransaction(); 

    try 
    { 
     if (this.addRisk(osqlTrans, osqlCon)) 
     { 
     if (this.addEconomical(osqlTrans, osqlCon)) 
     { 
      osqlTrans.Commit(); 
     } 
     } 
    } 
    catch (Exception ex) 
    { 
     osqlTrans.Rollback(); 
    } 
    finally 
    { 
     osqlCon.Close(); 
    } 
    return m_flag; 
} 

public bool addRisk(SqlTransaction oRiskTrans, SqlConnection oRiskConn) 
{ 
    con = new SqlConnection(constr); 
    if (con.State != ConnectionState.Open) 
    { 
     con.Open(); 
    } 
    cmd = new SqlCommand("insert into tblEnrollmentData (EID,Eyear,Epercent) values('" + id + "','" + str + "','" + dbPercent + "')", con); //Even i tried adding transaction in command statement 
      if (cmd.ExecuteNonQuery() > 0) 
      { 
       m_flag = true; 
      } 
    } 

public bool addEconomical(SqlTransaction oRiskTrans, SqlConnection oRiskConn) 
{ 
    con = new SqlConnection(constr); 
    if (con.State != ConnectionState.Open) 
    { 
     con.Open(); 
    } 
    cmd = new SqlCommand("insert into tblEnrollmentData (EID,Eyear,Epercent) values('" + id + "','" + str + "','" + dbPercent + "')", con);//Even i tried adding transaction in command statement 
      if (cmd.ExecuteNonQuery() > 0) 
      { 
       m_flag = true; 
      } 
    } 

我試圖失敗的第二個條件,但我的第一個語句插入到DB回滾事務..我應該爲了克服這個

+3

osqlTrans'的'的使用是令人震驚! – leppie

回答

4

我做什麼猜測它的o這些東西

1)您沒有使用相同的連接對象的所有不同的命令NE
2)你執行它們
3之前,您不分配交易的命令)都可能

嘗試使用相同的連接對象並將事務分配給命令,然後執行示例,請參閱MSDN上的此頁。 http://msdn.microsoft.com/en-us/library/86773566.aspx

+0

它是#1最有可能的。 –

3

事務不在連接之間共享,並且您始終創建新連接。使用oRiskConn指定爲方法的第二個參數。

0

由於您正在每個功能中創建一個新的連接,您的代碼不起作用。只是刪除連接

`con = new SqlConnection(constr);` 

可用在您的函數,即

oRiskConn連接替換它並沒有初始化它作爲一個新的連接。如果您再次按照您的要求進行交易,則無法使用。在命令對象中還包括oRiskTrans。然後,它會工作按您的要求

0

我不知道你的一些參數是,但它看起來像你想是這樣的:

class SomeClass 
{ 
    // These need to be set to appropriate values 
    int id, str; 
    double dbPercent; 
    string constr; 

    public bool addWhole() 
    { 
     var m_flag = false; 
     using (var osqlCon = new SqlConnection(constr)) 
     { 
      if (osqlCon.State != ConnectionState.Open) 
      { 
       osqlCon.Open(); 
      } 

      using (var osqlTrans = osqlCon.BeginTransaction()) 
      { 
       try 
       { 
        if (m_flag = this.addRisk(osqlTrans)) 
        { 
         if (m_flag = this.addEconomical(osqlTrans)) 
         { 
          osqlTrans.Commit(); 
         } 
        } 
       } 
       catch (Exception) 
       { 
        // Use $exception in watch window if you are debugging 
        osqlTrans.Rollback(); 
       } 
      } 
     } 
     return m_flag; 
    } 

    public bool addRisk(SqlTransaction oRiskTrans) 
    { 
     var m_flag = false; 
     using (var cmd = new SqlCommand("insert into tblEnrollmentData (EID,Eyear,Epercent) values('" + id + "','" + str + "','" + dbPercent + "')")) 
     { 
      cmd.Transaction = oRiskTrans; 
      cmd.Connection = oRiskTrans.Connection; 
      if (cmd.ExecuteNonQuery() > 0) 
      { 
       m_flag = true; 
      } 
     } 
     return m_flag; 
    } 

    public bool addEconomical(SqlTransaction oRiskTrans) 
    { 
     var m_flag = false; 
     using (var cmd = new SqlCommand("insert into tblEnrollmentData (EID,Eyear,Epercent) values('" + id + "','" + str + "','" + dbPercent + "')")) 
     { 
      cmd.Transaction = oRiskTrans; 
      cmd.Connection = oRiskTrans.Connection; 

      if (cmd.ExecuteNonQuery() > 0) 
      { 
       m_flag = true; 
      } 
     } 
     return m_flag; 
    } 
} 
相關問題