当 运行 集成测试抛出 SqlException

When run integration tests throw SqlException

我正在 运行 集成测试。在开始测试之前,我删除了数据库并重新创建了它。第一次测试成功。但是在第二次测试开始时我得到一个异常:

SetUp : System.Data.SqlClient.SqlException : Cannot drop database "Test" because it is currently in use.

代码:

[TestFixture]
class Class1
{
    public SqlConnection Repository;

    [SetUp]
    public void LocInit()
    {
        Repository = new SqlConnection(@"Data Source=.\SQLEXPRESS; Integrated Security=true;");
        Repository.Open();
        Repository.Execute("USE master;");
        Repository.Execute("DROP DATABASE Test;");
        Repository.Execute("USE master; CREATE DATABASE Test;");
        Repository.Execute("USE Test;");
    }

    [Test]
    public void Test1()
    {
        using (var repository = new SqlConnection(@"Data Source=.\SQLEXPRESS; Integrated Security=true;"))
            repository.Execute("USE Test; SELECT 10");
    }

    [Test]
    public void Test2()
    {
        using (var repository = new SqlConnection(@"Data Source=.\SQLEXPRESS; Integrated Security=true;"))
            repository.Execute("USE Test; SELECT 10");
    }

    [TearDown]
    public void LocalTearDown()
    {
        Repository.Dispose();
    }
}

为什么我会得到这个异常?

您遇到此类问题的原因是仍有一些挂起的连接可能尚未被终止。一种解决方法是在实际删除 DB 之前,如 here 所述终止所有连接:

ALTER DATABASE Test SET SINGLE_USER WITH ROLLBACK IMMEDIATE

另一个是追查为什么还有这样的联系。 This 线程展示了如何列出与数据库的所有连接并以正确的方式删除它。

我自己还没有尝试过,但也许你可以试试这个:

在连接字符串中设置 Pooling=false

删除数据库前清除池: SqlConnection.ClearAllPools()

"Cannot drop database because it is currently in use". How to fix?