如何分离 NCrunch 节点服务使用的所有 LocalDb 数据库

有时,使用 LocalDB 的测试的清理代码未运行(可能是在取消测试时)。结果是很多垃圾本地db数据库。


我在运行尝试创建另一个 localDB 的测试时收到这样的错误



System.Data.SqlClient.SqlException: Unable to create/attach any new database because the number of existing databases has reached the maximum number allowed: 32765.

   ved System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)

   ved System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)

   ved System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)

   ved System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)

   ved System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite)

   ved System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry)

   ved System.Data.SqlClient.SqlCommand.ExecuteNonQuery()

   ved Dapper.SqlMapper.ExecuteCommand(IDbConnection cnn, CommandDefinition& command, Action`2 paramReader)

   ved Dapper.SqlMapper.ExecuteImpl(IDbConnection cnn, CommandDefinition& command)

   ved Dapper.SqlMapper.Execute(IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Nullable`1 commandTimeout, Nullable`1 commandType)


每个测试类中的测试清理是这样的(使用 xunit)


public override void Dispose()

{

    base.Dispose();

    FreeDb();

    GC.SuppressFinalize(this);

}



慕村225694
浏览 195回答 2
2回答

慕尼黑8549860

使用Sql server Management Studio连接以下服务器(LocalDb)\MSSQLLocalDB然后使用以下语句确定哪些数据库是 localDb:SELECT * FROM sys.databases在此更正以下 detach localdb 语句以仅分离 localdbs 之后:DECLARE @rowCount INT = 1DECLARE @databaseName NVARCHAR(MAX)WHILE @rowCount = 1BEGIN    SET @databaseName = null    SELECT TOP(1)    @databaseName = name    FROM sys.databases    WHERE database_id >= 5    SET @rowCount = @@ROWCOUNT    IF @rowCount = 1    BEGIN        exec sp_detach_db @databaseName    ENDEND就我而言,database_id 4 以上的所有内容似乎都是 localdbs,但这对您来说可能有所不同。

德玛西亚99

情况似乎更糟。正在使用的 localdb 实例来自我的 NCrunch 节点。以 SYSTEM 用户身份运行。因此,从具有管理员权限的 PowerShell 提示符运行choco install pstools进而psexec -i -s CMD获取以 SYSTEM 身份运行的命令提示符那里的 sqllocaldb.exe 也不太走运,但粘贴 SQL Management Studio 的完整路径确实做到了:"C:\Program Files (x86)\Microsoft SQL Server\140\Tools\Binn\ManagementStudio\Ssms.exe"连接到服务器 (LocalDb)\MSSQLLocalDB然后我按照安德斯的方法连接到(LocalDb)\MSSQLLocalDB,然后我做了DECLARE @rowCount INT = 1DECLARE @databaseName NVARCHAR(MAX)WHILE @rowCount = 1BEGIN    SET @databaseName = null    SELECT TOP(1)    @databaseName = name    FROM sys.databases    WHERE database_id >= 7    SET @rowCount = @@ROWCOUNT    IF @rowCount = 1    BEGIN        exec sp_detach_db @databaseName        exec sp_dbremove @databaseName    ENDEND在sp_dbremove已被弃用,但得到这里完成任务。现在甚至删除了 .mdf 和 _log.ldf 文件。之后 dbs 的数量从 32765 减少到 6,当这样计算时:SELECT COUNT(1) FROM sys.databases
打开App,查看更多内容
随时随地看视频慕课网APP