簡體   English   中英

如何刪除生成的帶有打開連接的 mdf 文件?

[英]How do you delete a generated mdf file with open connections?

我用這個代碼創建了一個數據庫:

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”、數據庫不存在或數據庫未處於允許訪問檢查的狀態。

我自己想出來的。 如果您調用 SqlConnection.ClearPool(connection),所有到您的 mdf 文件的連接都將被刪除,之后您可以輕松地將其刪除。

回顧這一點,這是一個可怕的解決方案,應該避免,因為這種結構意味着您的單元測試現在依賴於外部數據庫。 祝你在 Azure Pipeline 中運行它好運。

如果可以,請使用 EntityFramework InMemory 數據庫:

https://docs.microsoft.com/en-us/ef/core/providers/in-memory/?tabs=dotnet-core-cli

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM