簡體   English   中英

C#-SQL連接無法關閉

[英]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屬性設置為nofalse ,連接實際上應該在服務器上關閉。

您可以通過在以下代碼中啟用或禁用連接池的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.

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