2009-12-20 2 views
1

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

дозвуковых версия 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(); 
        } 
       } 

ответ

0

Похоже, что у вас есть 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(); 
    } 
} 
+0

Я думаю, что эта ошибка будет следовать за дозвуковыми пользователями навсегда. Это было неправильно в документах некоторое время назад. Чтобы запомнить правильный порядок, я всегда помню, что Connection должен знать о транзакции, и, таким образом, транзакция идет первым. Отклоните скобки из строки TransactionScope. Делает его более читаемым с помощью вложенных предложений. –

0

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

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

 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); 
     }