[英]C# - SQL Connection won't close
我正在制作一個與某些SQL Server數據庫進行交互的C#程序。 問題是,如果我連接到數據庫(dbA),然后關閉此連接,然后再打開另一個數據庫到另一個數據庫(dbB),然后執行dbA還原,則SqlException觸發說數據庫(dbA)正在使用。 但是,如果我執行程序並僅連接到dbB,則可以毫無問題地還原其他數據庫,就像保持第一個連接一樣。 無論如何,以下是連接應該打開和關閉的代碼:
private bool CheckConnection()
{
bool res = false;
string conString = string.Empty;
if (!String.IsNullOrEmpty(serverBox.Text) && !String.IsNullOrEmpty(dbBox.Text))
{
conString = ConcatConString(dbBox.Text);
using (SqlConnection conn = new SqlConnection(conString))
{
conn.Open();
if (conn.State == ConnectionState.Open)
{
res = true;
}
}
}
return res;
}
ADO.NET使用連接池來重用昂貴的連接對象。 關閉連接時,所有現有事務都會回滾,其服務器端狀態將重置,並將其放置在連接池中,等待下一個“ Open
命令。
但是,對於服務器而言,當您嘗試執行諸如關閉服務器,還原數據庫等劇烈動作時,該連接仍視為服務器連接。這意味着您必須采取顯式操作並告訴服務器可以繼續進行。
在這種情況下,您需要將數據庫設置為“單用戶”模式,執行還原操作,然后將其恢復為“多用戶”模式,例如:
ALTER DATABASE [MyDB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
RESTORE DATABASE [MyDB] ...
ALTER DATABASE [MyDB] SET MULTI_USER
這就是SSMS所做的,當您在還原時選中“關閉數據庫的現有連接”選項時
如果您想給現有連接一些時間來完成,也可以使用WITH ROLLBACK AFTER xx SECONDS
。 但是,在這種情況下,您將覆蓋數據庫。
關閉連接不會在數據庫處關閉它,它只是將連接返回到ADO.Net維護的池。 通常,我永遠不會建議這樣做,但是似乎您可能有禁用連接池的合理理由。
在連接字符串中,將Pooling
屬性設置為no
或false
,連接實際上應該在服務器上關閉。
您可以通過在以下代碼中啟用或禁用連接池的SSMS中運行sp_who2
來觀察其工作方式:
class Program
{
static void Main(string[] args)
{
SqlConnectionStringBuilder bldr = new SqlConnectionStringBuilder();
bldr.IntegratedSecurity = true;
bldr.InitialCatalog = "YourDB";
bldr.DataSource = "(localdb)\\YourServer";
bldr.Pooling = false; //Comment and uncomment this and run sp_who2
using (SqlConnection con = new SqlConnection(bldr.ConnectionString))
{
con.Open();
}
}
}
更新資料
除非您的程序是唯一的連接,否則不要這樣做。 我覺得該程序專門用於還原數據庫。 如果數據庫上還有其他客戶端,則會降低性能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.