我有两个数据库: dbGlobal isSQL Server 2008
和 dbLocal is SQL Server 2008 CE
。出于业务原因,我需要将一些数据保留给用户本地,而其他数据对所有用户都是全局的。在许多情况下,我将在 dbLocal 中创建一个表,其中包含一个引用 dcGlobal 中的表的列。在我的 C# 代码中,我希望在事务中发生某些数据库操作。
我读过一个TransactionScope
对象可以处理两个数据库连接。如果这两个数据库连接之一连接到 SQL Server CE 实例,我认为情况可能并非如此。这是真的?这是我的代码:
using (TransactionScope scope = new TransactionScope())
{
using (DataContext dcGlobal = new DataContext(Program.dbGlobal),
dcLocal = new DataContext(Program.dbLocal))
{
ITable<tblDbGlobal> tblGlobal = dcGlobal.GetTable<tblDbGlobal>();
ITable<tblDbLocal> tblLocal = dcLocal.GetTable<tblDbLocal>();
//Invalid Operation Exception here
var join = from tGlobal in tblGlobal.ToList()
join tLocal in tblLocal.ToList() on
tGlobal.PkDbGlobal equals tLocal.FkDbGlobal
select new { tGlobal.Name, tLocal.Gender };
foreach (var item in join)
{
Console.WriteLine(string.Format("{0}, {1}", item.Name, item.Gender));
}
}
}
当我运行此代码时,我收到一条Invalid Operation Exception
消息“无法在事务范围内登记连接对象”。var join ...
在线。
虽然 dcLocal 在 localhost 上运行,但 dcGlobal 在网络上的另一台计算机上运行。我仔细检查了 MS DTC(分布式事务控制器)是否在两台计算机上运行,并确保将安全设置设置为允许几乎任何东西。我还关闭了两台计算机上的 Windows 防火墙。
我尝试使用DTCPing工具,但我遇到了一些错误。如果我将每台计算机的完整计算机名称输入到对方的 DTCPing 程序中,则什么也不会发生。我没有收到成功或失败的消息。我可以整天点击PING按钮。
如何为这两个数据库设置事务?
我意识到我可能不需要选择查询的事务范围。我只是以此为例。我将有更复杂的查询,包括插入、更新和删除,这些查询应该发生在可以跨越两个数据库的事务中。