2011-11-11 3 views
0

Salut à tous j'ai écrit la transaction suivante pour insérer des données, mais quand je reçois une exception que les données qui a l'exception et non l'insertion db le reste tout inséronsPeut-on dire ce qui est mal dans ma transaction

C'est ce que je l'ai écrit

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; 
      } 
    } 

J'ai essayé de annuler la transaction en omettant la deuxième condition, mais ma première déclaration est à insérait DB .. que dois-je faire pour surmonter cette

+3

L'utilisation de 'osqlTrans' est Shocking! – leppie

Répondre

4

Je suis deviner son o ne de ces choses

1) Vous n'utilisez pas le même objet de connexion pour toutes les différentes commandes
2) Vous n'êtes pas assignez la transaction aux commandes avant de les exécuter
3) Les deux peut-être

Essayez d'utiliser le même objet de connexion et d'affecter la transaction à la commande avant de l'exécuter pour un exemple voir cette page sur MSDN. http://msdn.microsoft.com/en-us/library/86773566.aspx

+0

C'est le n ° 1 le plus probable. –

3

La transaction n'est pas partagée entre les connexions et vous créez toujours une nouvelle connexion. Utilisez oRiskConn spécifié comme 2ème paramètre de vos méthodes.

0

Lorsque vous créez une nouvelle connexion dans chaque fonction, votre code n'a pas fonctionné. Il suffit de supprimer la connexion

`con = new SqlConnection(constr);` 

Remplacez-le par la connexion dans votre fonction i.e.

oRiskConn et ne pas initialiser comme une nouvelle connexion. Si vous l'avez fait à nouveau, votre transaction selon votre exigence ne fonctionnera pas. Incluez également oRiskTrans dans votre objet de commande. Ensuite, il fonctionne comme selon vos besoins

0

Je ne sais pas ce que certains de vos paramètres sont, mais il semble que vous voulez quelque chose comme ceci:

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; 
    } 
} 
Questions connexes