2012-08-08 110 views
0

我使用SQL Server 2005 Express用戶實例進行單元測試。各試驗隨機地生成的數據庫名稱,所以連接字符串看起來像這樣:刪除SQL Server Express用戶實例數據庫文件

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

其中624332256是隨機生成的數字。

最後我想刪除所有這些數據庫文件(.MDF.LDF)。

如果我打電話sp_detach_db甚至DROP DATABASEsys.databases刪除數據庫實例,但數據庫文件仍保留在%LOCALAPPDATA%\Microsoft\Microsoft SQL Server Data\SQLEXPRESS2005

如何刪除這些文件,也?我以爲DROP DATABASE應該這樣做,但它不是!

回答

0

我結束了編寫代碼來手動執行此操作,查詢物理文件名:

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)); 
      } 
     } 
    } 
} 
相關問題