[英]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.