Ошибка дозвуковой транзакции - PullRequest
1 голос
/ 17 июля 2009

Учитывая следующий код:

        List<Processo> listaProcesso = new List<Processo>();

        Processo processo;

        processo = new Processo();
        processo.AgendamentoID = 9;
        processo.DataEntrada = DateTime.Now;
        processo.EtapaExecucao = 0;
        processo.RegistrosAfetados = 2;
        listaProcesso.Add(processo);

        processo = new Processo();
        processo.AgendamentoID = 9;
        processo.DataEntrada = DateTime.Now;
        processo.EtapaExecucao = 0;
        processo.RegistrosAfetados = 1;
        listaProcesso.Add(processo);


        using (TransactionScope ts = new TransactionScope())
        {
            using (SharedDbConnectionScope scs = new SharedDbConnectionScope())
            {
                foreach (Processo processoSave in listaProcesso)
                {
                    processoSave.Save();
                }
            }
            ts.Complete();
        }

Я не вижу никакой ошибки. Но когда save () вызывается во второй раз, я получаю MySqlException: уже существует открытый DataReader, связанный с этим подключением, который должен быть закрыт первым. Я использую Subsonic 3.0.0.3 и MySql.Data 6.0.4.0.

Заранее спасибо.

Карлос Эдуардо Аппель Кляйн

Ответы [ 6 ]

1 голос
/ 19 июля 2009

Лучше всего использовать BatchQuery: http://subsonicproject.com/docs/BatchQuery

0 голосов
/ 09 января 2010

Я нашел решение этой проблемы.

Загрузите последний дозвуковой исходный код и скомпилируйте его самостоятельно. Ошибка, кажется, в дозвуковом коде, и исправление было применено к последней кодовой базе.

0 голосов
/ 17 июля 2009

Я могу ошибаться, но я думаю, что команда BatchSave () не существует в SubSonic 3.0.

Забыл упомянуть, что я использую шаблоны ActiveRecord.

0 голосов
/ 17 июля 2009

Кроме того, вы должны использовать ProcessoCollection, а не список. В цикле добавьте свои элементы в коллекцию, затем вызовите myCollection.BatchSave ();

0 голосов
/ 17 июля 2009

Этот фрагмент кода является приложением, других звонков нет. Я построил, чтобы симулировать эту ошибку. Я изменил порядок использования, но ошибка продолжается.

Спасибо.

0 голосов
/ 17 июля 2009

Хммм, судя по ошибке, я бы предположил, что где-то еще в вашем приложении вы используете DataReader / IDataReader и не избавлялись от него до сохранения всех ваших записей «processo».

Вам также необходимо изменить порядок использования операторов, поскольку TransactionScope должен быть внутри. Для фрагмента кода о том, как выполнить то, что вы пытаетесь сделать выше, вам нужно взглянуть на SubSonic Transaction link

...