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