SubSonic事务 - 使用第一个表中的返回标识插入第二个表

时间:2009-12-20 21:14:03

标签: subsonic subsonic3

我使用下面的代码更新第二个表(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 :(得分: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();
  }
}

答案 1 :(得分:0)

根据我在评论中所写的内容,我能够实现这一目标的唯一方法是首先使用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);
        }