SMO服务器连接未关闭

时间:2011-04-05 01:12:06

标签: database-connection rename smo


我正在编写一个C#应用程序,它将客户机从一个应用程序版本升级到另一个应用程序。第一步是创建SQL数据库的备份。我正在使用SMO这样做,它工作正常。接下来我卸载一个Windows服务。然后我尝试使用SMO重命名我备份的数据库。这失败了,因为它说它无法获得对数据库的独占访问权限。当我查看活动监视器时,我可以看到有两个连接到我正在尝试重命名的数据库。一个连接是我用来尝试重命名数据库的连接,另一个连接是我用来备份数据库的连接。它的状态正在睡眠,但我假设这就是为什么我无法获得重命名数据库的独占访问权限。我很惊讶地发现SMO对象没有实现IDisposable。我尝试将我的Server对象引用设置为null incase垃圾收集可能会有所帮助,但这不起作用。连接保持不变直到我退出应用程序。

所以我有几个问题

  1. 如何摆脱第一次连接?我知道这是可能的,因为它发生在我的应用程序关闭时
  2. 我可以使用SMO将数据库置于单用户模式或以其他方式强制重命名吗?
  3. 由于

1 个答案:

答案 0 :(得分:1)

如果我通过添加Pooling = false来关闭连接字符串中的池,我就可以使用它。然后在ServerConnection上调用Disconnect:

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();
}

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也可以,但还没试过。