【问题标题】:Delete SQL Server Express user instance database files删除 SQL Server Express 用户实例数据库文件
【发布时间】:2012-08-08 05:30:28
【问题描述】:

我使用 SQL Server 2005 Express 用户实例进行单元测试。每个测试随机生成一个数据库名称,因此连接字符串如下所示:

Data Source=.\SQLEXPRESS2005;Database=MyTest_624332256;User Instance=true;Integrated Security=SSPI;

其中624332256 是一个随机生成的数字。

最后我想删除所有这些数据库文件(.MDF.LDF)。

如果我调用sp_detach_db 甚至DROP DATABASE,它会从sys.databases 中删除数据库实例,但数据库文件仍保留在%LOCALAPPDATA%\Microsoft\Microsoft SQL Server Data\SQLEXPRESS2005

我如何也删除这些文件?我以为DROP DATABASE 应该这样做,但事实并非如此!

【问题讨论】:

    标签: .net sql-server sql-server-express


    【解决方案1】:

    我最终编写代码手动执行此操作,查询物理文件名:

    public static void CleanUpAllTestDbs()
    {
            using (var connection = new SqlConnection(connString))
            {
                connection.Open();
    
                var dbNames = new List<string>();
                using (var command = connection.CreateCommand())
                {
                    command.CommandText = @"
    USE master
    
    SELECT name FROM sysdatabases WHERE name LIKE 'MyTest_%'";
    
                    using (var reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            dbNames.Add(reader.GetString(0));
                        }
                    }
                }
    
                foreach (var dbName in dbNames)
                {
                    GetDatabaseFiles(connection, dbName, databaseFiles);
                    DetachDatabase(connection, dbName);
                }
            }
    
            // Delete the physical files
    
            foreach (var filePath in databaseFiles)
            {
                File.Delete(filePath);
            }
    }
    
    private static void DetachDatabase(DbConnection connection, string dbName)
    {
        using (var command = connection.CreateCommand())
        {
            command.CommandText = string.Format(@"
    USE master
    
    ALTER DATABASE [{0}] SET OFFLINE WITH ROLLBACK IMMEDIATE
    DROP DATABASE [{0}]", dbName);
    
            try
            {
                command.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                if (!ex.Message.StartsWith("Unable to open the physical file", StringComparison.OrdinalIgnoreCase))
                    throw;
            }
        }
    }
    
    private static void GetDatabaseFiles(DbConnection connection, string dbName, List<string> results)
    {
        using (var command = connection.CreateCommand())
        {
            command.CommandText = "SELECT physical_name FROM [" + dbName + "].sys.database_files";
    
            using (var reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    results.Add(reader.GetString(0));
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-01-22
      • 2021-12-24
      • 1970-01-01
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      • 1970-01-01
      相关资源
      最近更新 更多