ADO.Net交易不起作用

时间:2010-10-07 15:06:22

标签: c# .net transactions

我有以下代码(我是.NET事务的新手),它似乎确实在执行。它是通过Web服务调用的,我很难调试:

 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 个答案:

答案 0 :(得分:0)

您使用属性(Connection)来加载using语句对我来说是可疑的。通常using用于新的本地对象实例,如下所示:

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

当您退出using语句时,IDbConnection会在Dispose()上调用Dispose(),但我没有看到更新该属性以反映该状态的任何地方。这就是你想要的吗?

您可能还需要IDbCommand SqlCommand,这里不清楚 - 但对于try..except,这是真的。

在{{1}}中包装访问数据库的整个代码也是有帮助的,这样您就可以诊断和/或传播任何数据库异常。