关闭MSSQL服务器上的数据库连接

本文关键字:数据库连接 服务器 MSSQL 关闭 | 更新日期: 2023-09-27 17:54:33

我正在编写集成测试来验证存储库中的行为。我遇到的问题是,我想为每个测试从一个干净的数据库开始。我设法通过如下方式编写安装程序:

    [SetUp]
    public void SetUp()
    {
        _applicationContext = new TestApplicationContext();
        _applicationContext.Database.Connection.Close();
        _applicationContext.Database.Delete();
        _applicationContext.Database.Create();
        _tenantRepository = new TenantRepository(_applicationContext);
        _userRepository = new UserRepository(_applicationContext);
    }

TestApplicationContext设置数据库名称为TestDatabase

在我想要检查实际数据库的测试结果之前,这工作得很好。然后,我从MSSQL服务器连接到相同的数据库,它不会关闭,直到我:

  • 关闭MSSQL服务器
  • 使用close all connections选项删除数据库

我发现唯一的方法是通过SQL命令。也许是因为我对MSSQL知之甚少,但我有点希望有一个"关闭连接"按钮/选项。

如何关闭从MSSQL服务器到数据库的连接?或者,有没有一种方法,我可以从c#编程做到这一点?

更新:

也许我没有很清楚。但是,在我打开MSSQL并查看表的内容后,测试设置失败了。这是因为MSSQL还创建了一个到TestDatabase的连接,而我的集成测试无法关闭那个连接。所以我正在寻找一个解决方案,允许我关闭我从MSSQL服务器创建的连接。

关闭MSSQL服务器上的数据库连接

如果不是删除并重新创建整个数据库,而是删除并重新创建所选表(或所有表),则可以解决连接问题。

你可以创建一个小脚本,它将以一种你不需要硬编码表名的方式为你做:http://www.apexure.com/blog/2010/07/29/delete-all-tables-in-sql-server-database/

或者,Julia Lerman在她的书"编程实体框架:代码优先"中以更成熟的形式提到了这种方法,作为自定义数据库初始化器:

除了编写自己的自定义初始化器之外,您还可以找到别人创建的初始化器。其中一个例子是在EFCodeFirst中可用。CreateTablesOnly NuGet包。这初始化器将允许您删除和创建表现有的数据库,而不是删除和创建实际的数据库本身。如果你的目标是的托管数据库,您无权删除或创建整个数据库。

您正在将连接释放回连接池,而不是实际上关闭它。不是为每个测试创建/删除数据库,而是在设置中开始新事务,在清理中回滚。这样就不会有任何更改提交到您的数据库,并且您的测试将始终从一个干净的状态开始。

另外,因为您是针对实时数据库进行测试,所以我不会将您的测试称为"单元"测试。单元测试没有任何外部依赖。

可靠地获得数据库独占锁的唯一方法是使用SINGLE_USER WITH ROLLBACK IMMEDIATE技术。我建议您创建一个状态为空的数据库快照,并每次都恢复到该快照。这样会快得多。