【问题标题】:SMO Server connection not closedSMO 服务器连接未关闭
【发布时间】:2011-04-05 20:43:42
【问题描述】:


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

所以我有几个问题

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

谢谢

【问题讨论】:

    标签: database-connection rename smo


    【解决方案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();
    }
    

    我认为 server.ConnectionContext.Disconnect 也可以,但还没有尝试过。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-21
      • 2018-12-09
      • 2018-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-07
      • 1970-01-01
      相关资源
      最近更新 更多