2011-11-11 26 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; 
    } 
} 
相关问题