当一个数据库是SQL Server CE时,如何将TransactionScope与两个数据库一起使用

本文关键字:数据库 TransactionScope 一起 两个 一个 SQL Server CE | 更新日期: 2023-09-27 18:20:12

我有两个数据库:dbGlobal是SQL Server 2008,dbLocal是SQL Server 2008 CE。出于业务原因,我需要将一些数据保留为用户的本地数据,而将其他数据保留为所有用户的全局数据。在许多情况下,我会在dbLocal中有一个表,它有一个引用dcGlobal中表的列。在我的C#代码中,我希望在事务中进行某些数据库操作。

我已经读到单个TransactionScope对象可以处理两个数据库连接。我认为,如果这两个数据库连接中的一个连接到SQLServerCE实例,则可能不会出现这种情况。这是真的吗?这是我的代码:

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));
        }
    }
}

当我运行此代码时,我会在var join ...行得到一个Invalid Operation Exception,其中包含消息"无法在事务范围中登记连接对象"。

当dcLocal在localhost上运行时,dcGlobal在网络上的另一台计算机上运行。我仔细检查了两台计算机上是否都在运行MS DTC(分布式事务控制器),并确保安全设置几乎允许任何操作。我还关闭了两台电脑上的windows防火墙。

我试着使用DTCPing工具,但我遇到了一些错误。如果我在另一台计算机的DTCPing程序中键入每台计算机的完整名称,则不会发生任何事情。我既没有收到成功也没有收到失败的信息。我可以整天点击PING按钮。

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

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

当一个数据库是SQL Server CE时,如何将TransactionScope与两个数据库一起使用

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