0

単体テストにはSQLServer2005Expressユーザーインスタンスを使用しています。各テストはデータベース名をランダムに生成するため、接続文字列は次のようになります。

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

ここ624332256で、はランダムに生成された番号です。

.MDF最後に、これらのデータベースファイル(および)をすべて削除します.LDF

呼び出しsp_detach_dbたりDROP DATABASE、DBインスタンスをから削除したりしてもsys.databases、データベースファイルは%LOCALAPPDATA%\Microsoft\Microsoft SQL Server Data\SQLEXPRESS2005

ファイルも削除するにはどうすればよいですか?私はこれをすることになっていたと思っDROP DATABASEたが、そうではない!

4

1 に答える 1

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));
            }
        }
    }
}
于 2012-08-28T03:46:00.847 に答える