gpt4 book ai didi

c# - TransactionScope 在用于数据库单元测试时导致 TransactionManagerCommunicationException

转载 作者:太空狗 更新时间:2023-10-29 23:26:33 25 4
gpt4 key购买 nike

我想在我的数据库中运行一些存储过程测试而不实际影响数据(或者,更准确地说,在测试运行后没有持久影响)。

经过一些研究,我想到了在我的 Visual Studio 2010 测试项目中使用 TransactionScope 的方法,例如

using( new TransactionScope())
{
using( SqlConnection connection = new SqlConnection("someConnectionString"))
{
connection.Open();
using( SqlCommand command = new SqlCommand( "some sql", connection ))
{
// Do some database stuff...
}
}
}

现在只要我将所有这些都放在一个测试方法中就可以正常工作,即当 TransactionScope 的 using block 完成时,我对数据库的所有更改都会自动回滚。

我现在的问题是我想在 ClassInitialize 中做一些数据库的事情,所以我只需要为每个测试类做一次,而不是为每个测试方法做一次。当我创建一个公共(public) TransactionScope 属性并在 ClassInitialize 方法中为其分配一个 TransactionScope 实例时,这工作正常。一旦我在其中一个测试方法中执行任何与数据库相关的操作,我就会在该方法中遇到 TransactionManagerCommunicationException。

我不太明白为什么会这样,我也想知道我的方法是否有错误,或者我如何才能让它工作而不必设置 TransactionScope 包括所有设置再次为每个测试方法中的测试添加内容。

编辑

下面的代码摘录,我希望这能提供足够的信息:

public TransactionScope Scope { get; set; }

[ClassInitialize]
public static void ClassInitialize( TestContext testContext )
{
Scope = new TransactionScope();
// Do some db set up stuff, e.g. create records used for tests etc.
}

[ClassCleanup]
public static void ClassCleanup()
{
Scope.Dispose();
}

[TestMethod]
public void MyTestMethod()
{
using( SqlConnection connection = new SqlConnection( "someConnectionString" ) )
{
DataTable result = new DataTable();
using( SqlCommand command = new SqlCommand( "spName", connection ) )
{
command.CommandType = CommandType.StoredProcedure;
using( SqlDataAdapter adapter = new SqlDataAdapter() )
{
adapter.SelecteCommand = command;
// The next line causes the exception to be thrown
adapter.Fill( result );
}
}

// Assertions against DataTable result
}
}

异常(exception)情况是


TransactionManagerCommunicationException 未被用户代码处理分布式事务管理器 (MSDTC) 的网络访问已被禁用。请使用组件服务管理工具在 MSDTC 的安全配置中为网络访问启用 DTC。


我知道我可以尝试更改设置,但我不明白为什么一开始我会遇到异常 - 与在单个(测试)方法中使用上面的代码相比有什么不同?

提前致谢

最好的问候

G.

最佳答案

您的异常是说未启用 MSDTC。我的猜测是,当您单独使用 TransactionScope 时,它​​只是创建本地 SQL 事务——不需要 DTC。但是,当您通过多个连接共享 TransactionScope 时,事务会通过您可能未启用的 DTC“提升”为分布式事务。

尝试在本地计算机和服务器上启用 MSDTC 的网络访问。执行此操作的步骤因操作系统而异。 Here's how to do it in Win 2003 Server . Here's a link for Win 2008 .请注意,您可能还需要通过防火墙启用 DTC(在最后一个链接中解释...)

关于c# - TransactionScope 在用于数据库单元测试时导致 TransactionManagerCommunicationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4734679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com