SQL Server用户实例错误:现有数据库已达到允许的最大数量

lwa*_*way 4 c# sql sql-server user-instance sql-server-express

我在Visual Studio 2008中使用C#在我的PC上循环MDF文件并从中提取数据.我正在使用表适配器指向本地MDF文件.

最近我的一台PC拒绝让我附上任何新的数据源,正如它所说的那样

System.Data.SqlClient.SqlException:无法创建/附加任何新数据库,因为现有数据库的数量已达到允许的最大数量:32766

即使我启动一个全新的Windows应用程序并尝试将MDF文件(在我的桌面上)作为数据源添加到它,我也会收到上述错误.

谁能告诉我如何删除/删除现有连接?

我的代码在另一台PC上工作正常,我在我的电脑上重新安装了Visual Studio但仍然出现此错误.

C#表适配器代码:

tmTableAdapter.Connection.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename='" + pathofmdffile + "';Integrated Security=True;Connect Timeout=30;User Instance=True";
tmTableAdapter.Connection.Open();
Run Code Online (Sandbox Code Playgroud)

Sol*_*zky 5

重新安装VS将无法解决,因为错误来自SQL Server.

看看这些有很多好消息的MSDN页面:

由于您使用的是"用户实例",我想连接到主SQLEXPRESS实例时,DB不会显示.

要检查的事项:

  • 在SSMS中,通过执行以下操作连接到上次连接的数据库:

    • 转到对象资源管理器
    • 与数据库引擎的新连接
    • 在"连接到服务器"弹出窗口中:
    • 单击"选项>>"按钮
    • 转到"其他连接属性"选项卡
    • 在文本区域中输入以下内容:
      User Instance = true
    • 单击"连接"按钮
    • 展开"数据库"文件夹.您应该全部看到它们,命名为MDF文件的完整路径
    • 右键单击数据库
    • 转到"任务>"
    • 第一个选项是"分离"

    显然这对于​​32,766个数据库来说并不实用,但对于少数数据库来说这是最好的选择.

  • 默认情况下,sqlservr.exe进程会挂起60分钟,并且在终止之前附加的任何数据库都会添加到列表中,并可能会重置到期计数器.您可以通过连接到最新附加的数据库立即结束该过程(如上所述;这些步骤适用于新查询,或者如果通过对象资源管理器连接,则右键单击实例名称并转到"新查询" ),并运行以下内容:

    SHUTDOWN;
    
    Run Code Online (Sandbox Code Playgroud)

    这将一次性清除所有连接的数据库.

  • 将超时设置为小于60分钟.根据SQL Server Express用户实例页面(与上面相同的链接):

    父实例上的系统管理员可以使用sp_configure更改用户实例超时选项来设置用户实例的超时期限.默认值为60分钟.

    在SSMS中(确保您已连接到实例):

    -- View current setting (in the "run_value" field)
    EXEC sp_configure 'user instance timeout'
    -- Documentation says default is 60 but mine was 5
    
    
    -- If you can't see the option, run the following:
    EXEC sp_configure 'show advanced options', 1;
    RECONFIGURE;
    
    
    -- To change it, run the following:
    EXEC sp_configure 'user instance timeout', 5;
    
    Run Code Online (Sandbox Code Playgroud)
  • 使用"SQL Server Express Utility"分离一个或多个数据库:

  • 查看以下目录中将包含4个系统DB:

    • 在XP/Vista上:C:\ Documents and Settings {UserName}\Local Settings\Application Data\Microsoft\Microsoft SQL Server Data\SQLEXPRESS

    • 在Windows 7及更高版本:C:\ Users {UserName}\AppData\Local\Microsoft\Microsoft SQL Server Data\SQLEXPRESS

    这主要是信息性的,因为只要SQL Server进程正在运行,就无法删除这些文件.


对于持续的基础,如果要在循环中附加许多DB,则可以通过在使用每个DB时运行sp_detach_db以编程方式去除它们:

USE [master];
ALTER DATABASE [{DatabaseName}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
EXEC sp_detach_db @dbname =N'{DatabaseName}';
Run Code Online (Sandbox Code Playgroud)

仅供参考,"用户实例"现已弃用.您应该考虑使用SQL Server Express LocalDB.

  • 非常感谢你的帮助.一个清晰简洁的答案(对于像我这样的学习者)有链接,可以帮助我学习更多,很棒的答案.你可以一下子关闭所有连接吗?我可以像你上面说的那样单独分离但是如果可能的话就想选择和分离多个数据库(就像你说对所有32k dbs一样不切实际) (2认同)