【问题标题】:SMO Server connection not closedSMO 服务器连接未关闭
【发布时间】:2011-04-05 20:43:42
【问题描述】:
我正在编写一个 C# 应用程序,它将客户端计算机从一个应用程序版本升级到另一个应用程序版本。第一步是创建 SQL 数据库的备份。我正在使用 SMO 执行此操作,并且效果很好。接下来我卸载一个 Windows 服务。然后我再次尝试使用 SMO 重命名我备份的数据库。这失败了,因为它说它无法获得对数据库的独占访问权限。当我查看活动监视器时,我可以看到我正在尝试重命名的数据库有两个连接。一个连接是我用来尝试重命名数据库的连接,另一个是我用来备份数据库的连接。它的状态是睡眠,但我假设这就是我无法获得重命名数据库的独占访问权限的原因。我有点惊讶地发现 SMO 对象没有实现 IDisposable。我尝试将我的服务器对象引用设置为 null 以防垃圾收集可能会有所帮助,但这不起作用。连接一直存在,直到我退出应用程序。
所以我有几个问题
- 如何摆脱第一个连接?我知道这是可能的,因为它发生在我的应用程序关闭时
- 是否可以使用 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 也可以,但还没有尝试过。