2010-10-07 16 views
1

J'ai le code suivant (je suis nouveau pour les transactions .NET) et il semble être en cours d'exécution. Il est appelé par un webservice et il est difficile pour moi de debug:La transaction ADO.Net ne fonctionne pas

public void UpdateJailFiles(List<RMS.NameFile> names, RMS.Incident incident, int currentDate, int currentTime, int incidentKey) 
    { 
     String library = RMSLIBRARY; 

     IDbTransaction transaction; 

     using (IDbConnection conn = Connection) 
     { 
      conn.Open(); 
      transaction = conn.BeginTransaction(); 
      try 
      { 
       names.ForEach(nameFile => 
        { 
         IDbCommand command = conn.CreateCommand(); 
         command.CommandText = "call " + library + ".SP_NAMEFILE_UPDATE(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; 
         command.CommandType = CommandType.StoredProcedure; 
         command.CommandTimeout = 0; 
         command.Transaction = transaction; 

         IDbDataParameter param = command.CreateParameter(); 
         param.ParameterName = "@INCIDENTKEY"; 
         param.DbType = DbType.Int32; 
         param.Value = nameFile.IncidentKey; 
         command.Parameters.Add(param); 

         ///Many more params... 

         command.ExecuteNonQuery(); 
        }); 

       IDbCommand command2 = conn.CreateCommand(); 
       command2.CommandText = "call " + library + ".SP_INCIDENTFILE_UPDATE(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; 
       command2.CommandType = CommandType.StoredProcedure; 
       command2.Transaction = transaction; 

       IDbDataParameter param1b = command2.CreateParameter(); 
       param1b.ParameterName = "@CASENUMBER"; 
       param1b.DbType = DbType.String; 
       param1b.Value = incident.CaseNumber; 
       command2.Parameters.Add(param1b); 

       IDbDataParameter param2b = command2.CreateParameter(); 
       param2b.ParameterName = "@INCIDENTFROMDATE"; 
       param2b.DbType = DbType.Int32; 
       param2b.Value = incident.IncidentFromDate; 
       command2.Parameters.Add(param2b); 

       ///Many more params... 

       command2.ExecuteNonQuery(); 

       transaction.Commit(); 
      } // end try 
      catch (Exception) 
      { 
       transaction.Rollback(); 
      } 
     } // end using 

    } 

Voir problème avec ce code?

+1

pouvez-vous dire quelle erreur obtenez-vous? Essayez d'abord de le faire fonctionner dans une bibliothèque de classes pour pouvoir le déboguer et l'utiliser ensuite dans le service Web. – rauts

+0

@rauts Ha, bonne idée. L'erreur était en fait liée à un paramètre que je transmettais. Laissez-moi résoudre ce problème et voir si c'était le problème! – mint

+0

Vous interceptez une exception, annulez la transaction, puis ne faites rien. Vous devez le relancer ou l'enregistrer ou faire autre chose avec lui, sinon vous n'aurez aucune idée de ce qui n'a pas fonctionné. –

Répondre

0

L'utilisation d'une propriété (Connection) pour charger l'instruction using est suspecte pour moi. En règle générale using est utilisé sur une nouvelle instance d'objet local comme ceci:

using (IDbConnection conn = new MyConnectionClass()) 
    { 
    } 

Lorsque vous quittez la déclaration using, votre IDbConnection obtient Dispose() appelé, mais je ne vois nulle part que la propriété, il est mis à jour refléter ce statut. Est-ce que c'est ce que tu veux?

Vous pouvez également besoin de Dispose() votre IDbCommand, ce n'est pas clair ici - mais pour SqlCommand, c'est vrai.

Il peut également être utile d'enrouler le code entier qui accède au DB dans un try..except afin que vous puissiez diagnostiquer et/ou propager TOUTE exception DB.

Questions connexes