如何删除打开连接的生成的mdf文件?

时间:2016-03-08 11:04:56

标签: c# sql-server entity-framework

我用这段代码创建了一个数据库:

public static void CreateDatabase(string databasePath)
{
        AppDomain.CurrentDomain.SetData("DataDirectory", databasePath);

        using (var connection = new System.Data.SqlClient.SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;Initial Catalog=master; Integrated Security=true;;"))
        {
            connection.Open();

            using (var command = connection.CreateCommand())
            {
                command.CommandText =
                    String.Format("CREATE DATABASE {0} ON PRIMARY (NAME={0}, FILENAME='{1}')", "CoolDatabase", databasePath + @"\database.mdf");
                command.ExecuteNonQuery();

                command.CommandText =
                    String.Format("EXEC sp_detach_db '{0}', 'true'", "CotanDB");
                command.ExecuteNonQuery();
            }

            connection.Close();
        }
}

为我的单元测试创​​建了一个很好的工作.mdf文件。但是,在对它运行所有测试之后,我想再次将其删除,以免占用空间。

我试过了:

    public static void DestroyDatabase(string databasePath)
    {
        if (File.Exists(databasePath + @"\database.mdf"))
        {
            File.Delete(databasePath + @"\database.mdf");
        }

        if (File.Exists(databasePath + @"\database_log.ldf"))
        {
            File.Delete(databasePath + @"\database_log.ldf");
        }
    }

但是会引发错误

  

进程无法访问文件'数据库路径\ database.mdf'   因为它正被另一个进程使用。

所以我尝试关闭所有与数据库的连接,以便删除它并删除该文件。但是,这不起作用:

var server = new Server();
server.KillDatabase(databasePath + @"\database.mdf");

哪个投掷

  

无法连接到服务器..

如何销毁本地数据库文件?

编辑:我在评论的答案中尝试了代码:

 using (var connection = new System.Data.SqlClient.SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;Initial Catalog=master; Integrated Security=true;;"))
        {
            connection.Open();

            using (var command = connection.CreateCommand())
            {
                command.CommandText =
                    String.Format("USE master");
                command.ExecuteNonQuery();

                command.CommandText =
                    String.Format("ALTER DATABASE {0} SET SINGLE_USER WITH ROLLBACK IMMEDIATE", "CotanDB");
                command.ExecuteNonQuery();

                command.CommandText =
                    String.Format("DROP DATABASE {0}", "CoolDatabase");
                command.ExecuteNonQuery();
            }

            connection.Close();
        }

后面跟着相同的File.Delete代码。但这引发了:

  

用户无权更改数据库“CoolDatabase”,   数据库不存在,或者数据库未处于允许的状态   访问检查。

1 个答案:

答案 0 :(得分:0)

自己想出来。如果调用SqlConnection.ClearPool(连接),则会删除与mdf文件的所有连接,之后您可以轻松删除它。