运行集成测试时抛出SqlException

时间:2016-09-06 21:58:39

标签: c# nunit integration-testing dapper

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

  

SetUp:System.Data.SqlClient.SqlException:无法删除数据库“Test”,因为它当前正在使用中。

Сode:

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

为什么我会收到此异常?

2 个答案:

答案 0 :(得分:0)

您遇到此类问题的原因是仍有一些待处理的连接可能尚未被杀死。在实际删除数据库之前,一种解决方法是在描述here时终止所有连接:

ALTER DATABASE Test SET SINGLE_USER WITH ROLLBACK IMMEDIATE

另一个是追踪为什么会有这种联系。 This线程显示了如何列出与数据库的所有连接并以正确的方式摆脱它。

答案 1 :(得分:0)

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

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

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

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