2011-04-05 5 views
1


J'écris une application C# qui met à niveau les machines client d'une version d'application à une autre. La première étape consiste à créer une sauvegarde d'une base de données SQL. Je fais cela en utilisant SMO et ça marche bien. Ensuite, je désinstalle un service Windows. Ensuite, j'essaie de renommer la base de données que j'ai sauvegardée, encore une fois, en utilisant SMO. Cela échoue parce qu'il dit qu'il ne peut pas obtenir un accès exclusif à la base de données. Quand je regarde le moniteur d'activité, je peux voir qu'il y a deux connexions à la base de données que j'essaye de renommer. Une connexion est celle que j'utilise pour essayer de renommer la base de données, l'autre est celle que j'ai utilisée pour sauvegarder la base de données. C'est le statut qui dort, mais je suppose que c'est pourquoi je ne peux pas obtenir un accès exclusif pour renommer la base de données. J'ai été un peu surpris de constater que les objets SMO n'implémentaient pas IDisposable. J'ai essayé de définir ma référence d'objet Serveur à null la collecte des ordures incase pourrait aider, mais cela n'a pas fonctionné. Les connexions restent là jusqu'à ce que je quitte l'application.

J'ai donc quelques questionsLa connexion SMO Server n'est pas fermée

  1. Comment puis-je me débarrasser de la première connexion? Je sais que c'est possible parce que cela se produit lorsque mon application s'arrête
  2. Puis-je mettre la base de données en mode mono-utilisateur en utilisant ou forcer le changement de nom d'une autre manière en utilisant SMO?

Merci

Répondre

1

Je l'ai à travailler si j'éteins la mise en commun dans ma chaîne de connexion en ajoutant Pooling = false. Puis appeler Disconnect sur le 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(); 
} 

Je pense que server.ConnectionContext.Disconnect travaillerait aussi, mais n'ont pas essayé.

Questions connexes