【问题标题】:SubSonic Transactions - Inserting to a second table with the return identity from first tableSubSonic Transactions - 使用第一个表的返回标识插入到第二个表
【发布时间】:2010-09-02 02:02:01
【问题描述】:

我正在使用下面的代码使用第一个表中使用的标识 (info2.Id = info.Id;) 更新第二个表 (Info2)。执行第二次保存时 (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();
                    }
                }

【问题讨论】:

    标签: subsonic subsonic3


    【解决方案1】:

    看起来你的 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();
      }
    }
    

    【讨论】:

    • 我认为这个错误将永远伴随着亚音速用户。前段时间在文档中是错误的。为了记住正确的顺序,我始终记得 Connection 需要了解事务,因此事务首先进行。通过从 TransactionScope 行中取消括号。使用嵌套的 using 子句使其更具可读性。
    【解决方案2】:

    根据我在 cmets 中所写的内容,我可以使其工作的唯一方法是先使用 TransactionScope,然后使用 SharedDbConnectionScope(感谢 Adam)并添加 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);
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 2019-12-30
      • 1970-01-01
      相关资源
      最近更新 更多