Транзакция ADO.Net не работает - PullRequest
1 голос
/ 07 октября 2010

У меня есть следующий код (я новичок в транзакциях .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 Ответ

0 голосов
/ 07 октября 2010

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

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

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

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

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

...