0

我有两个数据库: 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按钮。

如何为这两个数据库设置事务?

我意识到我可能不需要选择查询的事务范围。我只是以此为例。我将有更复杂的查询,包括插入、更新和删除,这些查询应该发生在可以跨越两个数据库的事务中。

4

1 回答 1

2

您不能将分布式事务与 SQL Server Compact http://msdn.microsoft.com/en-us/library/bb896149.aspx一起使用

于 2013-06-27T14:37:41.293 回答