2010-10-07 98 views
1

我有以下代码(我是.NET事务新手),它看起来似乎正在执行。它通过web服务调用,很难调试:ADO.Net事务不起作用

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

你能告诉我你的错误吗?首先尝试让它在类库中工作,以便您可以调试它,然后在Web服务中使用它。 – rauts 2010-10-07 15:09:51

+0

@rauts哈,好主意。这个错误实际上与我传入的参数有关。让我解决这个问题,看看是否是这个问题! – mint 2010-10-07 15:15:30

+0

您发现异常,回滚事务,然后什么也不做。你需要重新抛出它或记录下来,或者用它做别的事情,否则你不会有什么错误的线索。 – 2010-10-07 15:43:38

回答

0

您使用一个属性(Connection)加载using声明是我怀疑。通常using用在一个新的,局部的对象实例,像这样:

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

当你退出using声明,您IDbConnection得到Dispose()调用它,但我没有在任何地方看到属性将其更新为反映这种状态。那是你要的吗?

您可能还需要Dispose()您的IDbCommand,这里不清楚 - 但对于SqlCommand,这是真的。

将访问数据库的整个代码打包到try..except中也可能有所帮助,以便诊断和/或传播任何数据库异常。