SSMS
 sql >> Base de données >  >> Database Tools >> SSMS

Comment supprimer des entrées de serveur dans l'écran Connexion au serveur de SQL Server Management Studio ?

On dirait que ce fichier est une version binaire sérialisée de Microsoft.SqlServer.Management.UserSettings.SqlStudio classe définie dans Microsoft.SqlServer.Management.UserSettings, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91 assembly (situé dans c:\Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Microsoft.SqlServer.Management.UserSettings.dll ).

Avec un peu de compétence en développement (Visual Studio ou même Powershell), vous pouvez désérialiser ce fichier dans la classe d'origine, trouver les entrées que vous souhaitez supprimer et re-sérialiser le fichier.

Cela devrait vous donner une idée (travailler sur une copie du fichier .bin)...

var binaryFormatter = new BinaryFormatter();
var inStream = new MemoryStream(File.ReadAllBytes(@"c:\temp\SqlStudio.bin"));
var settings = (SqlStudio) binaryFormatter.Deserialize(inStream);
foreach (var pair in settings.SSMS.ConnectionOptions.ServerTypes)
{
    ServerTypeItem serverTypeItem = pair.Value;
    List<ServerConnectionItem> toRemove = new List<ServerConnectionItem>();
    foreach (ServerConnectionItem server in serverTypeItem.Servers)
    {
        if (server.Instance != "the server you want to remove")
        {
            continue;
        }
        toRemove.Add(server);
    }
    foreach (ServerConnectionItem serverConnectionItem in toRemove)
    {
        serverTypeItem.Servers.RemoveItem(serverConnectionItem);
    }
}

MemoryStream outStream = new MemoryStream();
binaryFormatter.Serialize(outStream, settings);
byte[] outBytes = new byte[outStream.Length];
outStream.Position = 0;
outStream.Read(outBytes, 0, outBytes.Length);
File.WriteAllBytes(@"c:\temp\SqlStudio.bin", outBytes);

Après la question d'Adrian, j'ai essayé à nouveau sur une boîte Win7 x64 en utilisant Visual Studio 2010. J'ai trouvé la même erreur donc, après avoir creusé un peu, j'ai trouvé qu'il fallait un certain nombre d'étapes pour résoudre.

  1. Définissez la plate-forme cible sur "x86" dans les propriétés du projet
  2. ajouter une référence à Microsoft.SqlServer.Management.SDK.SqlStudio (sur ma boîte, c'était à c:\Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Microsoft.SqlServer.Management .Sdk.SqlStudio.dll)
  3. ajouter une référence à Microsoft.SqlServer.Management.UserSettings (dans le même répertoire que le précédent)
  4. effectuer une résolution d'assemblage personnalisée

La résolution de l'assembly personnalisé a pris un peu de temps car il n'était pas évident (pour moi, du moins) pourquoi le CLR ne résoudrait pas simplement l'assembly correctement et pourquoi Visual Studio ne me permettrait pas d'ajouter la référence manuellement. Je parle de SqlWorkbench.Interfaces.dll.

Le code mis à jour ressemble à ceci :

internal class Program
    {
        static void Main(string[] args)
        {
            AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

            var binaryFormatter = new BinaryFormatter();
            var inStream = new MemoryStream(File.ReadAllBytes(@"c:\temp\SqlStudio.bin"));
            var settings = (SqlStudio) binaryFormatter.Deserialize(inStream);
            foreach (var pair in settings.SSMS.ConnectionOptions.ServerTypes)
            {
                ServerTypeItem serverTypeItem = pair.Value;

                List<ServerConnectionItem> toRemove = new List<ServerConnectionItem>();
                foreach (ServerConnectionItem server in serverTypeItem.Servers)
                {
                    if (server.Instance != "the server you want to remove")
                    {
                        continue;
                    }
                    toRemove.Add(server);
                }
                foreach (ServerConnectionItem serverConnectionItem in toRemove)
                {
                    serverTypeItem.Servers.RemoveItem(serverConnectionItem);
                }
            }


            MemoryStream outStream = new MemoryStream();
            binaryFormatter.Serialize(outStream, settings);
            byte[] outBytes = new byte[outStream.Length];
            outStream.Position = 0;
            outStream.Read(outBytes, 0, outBytes.Length);
            File.WriteAllBytes(@"c:\temp\SqlStudio.bin", outBytes);
        }

        private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            Debug.WriteLine(args.Name);
            if (args.Name.StartsWith("SqlWorkbench.Interfaces"))
            {
                return Assembly.LoadFrom(@"C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\SqlWorkbench.Interfaces.dll");
            }
            return Assembly.Load(args.Name);
        }
    }