4

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

最近我的一台电脑拒绝让我附加任何新的数据源,因为它说

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

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

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

我的代码在另一台 PC 上运行良好,我已经在我的 PC 上重新安装了 Visual Studio,但仍然出现此错误。

C# 表适配器代码:

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

1 回答 1

5

重新安装 VS 将无济于事,因为错误来自 SQL Server。

查看这些 MSDN 页面,其中包含很多有用的信息:

由于您使用的是“用户实例”,我猜当连接到主​​ SQLEXPRESS 实例时数据库不会显示。

检查事项:

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

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

    显然,这对于 32,766 个数据库是不切实际的,但对于一些数据库来说,这是最好的选择。

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

    SHUTDOWN;
    

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

  • 将超时设置为小于 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;
    
  • 使用“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}';

仅供参考,“用户实例”现在已被弃用。您应该考虑使用SQL Server Express LocalDB

于 2015-01-13T16:10:10.853 回答