2010-10-07 5 views
1

У меня есть следующий код (я новичок в транзакциях .NET), и он действительно работает вообще. Это называется через веб-сервис и трудно для меня отлаживать:ADO.Net Transaction Not Working

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 

    } 

видит ничего плохого в этом коде?

+1

вы можете рассказать, какую ошибку вы получаете? сначала попробуйте заставить его работать в библиотеке классов, чтобы u мог отлаживать его, а затем использовать его в веб-службе. – rauts

+0

@rauts Ха, отличная идея. Ошибка на самом деле связана с параметром, в котором я проходил. Позвольте мне исправить это и посмотреть, была ли эта проблема! – mint

+0

Вы обнаруживаете исключение, откатываете транзакцию, а затем ничего не делаете. Вам нужно повторно бросить его или зарегистрировать его или сделать с ним что-то еще, иначе вы не поймете, что пошло не так. –

ответ

0

Ваше использование недвижимости (Connection) для загрузки заявления using вызывает у меня подозрение. Обычно using используется на новое, локального экземпляр объекта следующим образом:

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

При выходе из using заявления, ваш IDbConnection получает Dispose() называется на нем, но я не вижу где-нибудь, что имущество она обновляется отражают этот статус. Это то, что вы хотите?

Возможно, вам также понадобится Dispose() ваш IDbCommand, здесь неясно, но для SqlCommand, это правда.

Также может быть полезно обернуть весь код, который обращается к БД в try..except, чтобы вы могли диагностировать и/или распространять ЛЮБОЕ исключение БД.