SubSonic Transactions - вставка во вторую таблицу с идентификатором возврата из первой таблицы - PullRequest
1 голос
/ 21 декабря 2009

Я использую приведенный ниже код для обновления второй таблицы (Info2) с использованием идентификатора, используемого в первой таблице (info2.Id = info.Id;) Когда выполняется второе сохранение (info2.Save ()), я получаю сообщение об ошибке: «Уже есть открытый DataReader, связанный с этой командой, который должен быть закрыт первым». Может кто-нибудь увидеть, что я могу делать не так.

SubSonic версии 3.0.0.3 и SQL Server 2005

Спасибо

                using (SharedDbConnectionScope sharedConnectionScope = new SharedDbConnectionScope())
                {
                    using (TransactionScope ts = new TransactionScope())
                    {
                        Info info = new Info();
                        info.Desc = "Some information";
                        info.Save();

                        Info2 info2 = new Info2();
                        info2.Id = info.Id;
                        info2.Desc = "More information";
                        info2.Save();

                        ts.Complete();
                    }
                }

Ответы [ 2 ]

0 голосов
/ 28 декабря 2009

Согласно тому, что я написал в комментариях, единственный способ добиться этой работы - это сначала использовать TransactionScope, затем SharedDbConnectionScope (спасибо Адаму) и добавить MultipleActiveResultSets = True; (SQL Server 2005) к строке подключения.

У кого-нибудь есть лучшие решения или другие предложения? Спасибо

        try
        {
            using (TransactionScope ts = new TransactionScope())
            {
                using (SharedDbConnectionScope scs = new SharedDbConnectionScope())
                {
                    Info info = new Info();
                    info.Desc = "Some information";
                    info.Save();

                    //Test for rollback
                    //throw new Exception("STOP");

                    Info2 info2 = new Info2();
                    info2.Id = info.Id;
                    info2.Desc = "More information";
                    info2.Save();

                    ts.Complete();
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
0 голосов
/ 21 декабря 2009

Похоже, что вы получили TransactionScope и SharedDbConnectionScope в неправильном направлении, попробуйте:

using (TransactionScope ts = new TransactionScope())
{
  using (SharedDbConnectionScope sharedConnectionScope = new SharedDbConnectionScope())
  {
    Info info = new Info();
    info.Desc = "Some information";
    info.Save();

    Info2 info2 = new Info2();
    info2.Id = info.Id;
    info2.Desc = "More information";
    info2.Save();

    ts.Complete();
  }
}
...