2011-04-05 178 views
1


我正在編寫一個C#應用程序,用於將客戶端計算機從一個應用程序版本升級到另一個應用程序版本。第一步是創建一個SQL數據庫的備份。我正在使用SMO執行此操作,並且它工作正常。接下來我卸載一個Windows服務。然後我嘗試重新命名我使用SMO備份的數據庫。這失敗了,因爲它表示無法獲得數據庫的獨佔訪問權限。當我查看活動監視器時,可以看到有兩個連接到我要重命名的數據庫。一個連接是我用來嘗試重命名數據庫的連接,另一個連接是我用來備份數據庫的連接。它的狀態是睡覺,但我假設這就是爲什麼我不能獨佔訪問重命名數據庫。我有點驚訝地發現SMO對象沒有實現IDisposable。我試圖將我的服務器對象引用設置爲null incase垃圾回收可能會有所幫助,但這並不奏效。連接在那裏直到我退出應用程序。

所以,我有幾個問題SMO服務器連接未關閉

  1. 如何擺脫第一連接?我知道這是可能的,因爲它發生在我的應用程序關閉時
  2. 我可以將數據庫置於單用戶模式下還是使用SMO以其他方式強制重命名?

感謝

回答

1

我得到它,如果我關掉我的連接字符串池,加入池=假工作。然後呼籲一個ServerConnection斷開:

ServerConnection svrConn = null;

try 
{ 
    string connString = Cryptographer.Decrypt(ConfigurationManager.ConnectionStrings["CS"].ConnectionString); 
    svrConn = new Microsoft.SqlServer.Management.Common.ServerConnection(new System.Data.SqlClient.SqlConnection(connString)); 
    Server server = new Microsoft.SqlServer.Management.Smo.Server(svrConn); 
    Backup backup = new Microsoft.SqlServer.Management.Smo.Backup(); 

    ... 

    backup.SqlBackup(server); 
} 
catch (Exception ex) 
{ 
    ... 
} 
finally 
{ 
    if (svrConn != null) 
     svrConn.Disconnect(); 
} 

我覺得server.ConnectionContext.Disconnect也將工作,但還沒有嘗試過。