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