2011-04-05 146 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也将工作,但还没有尝试过。