SSMS
 sql >> Database >  >> Database Tools >> SSMS

Come eliminare le voci del server nella schermata Connect to Server di SQL Server Management Studio?

Sembra che questo file sia una versione serializzata binaria di Microsoft.SqlServer.Management.UserSettings.SqlStudio classe definita in Microsoft.SqlServer.Management.UserSettings, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91 assembly (situato in c:\Programmi\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Microsoft.SqlServer.Management.UserSettings.dll ).

Con un po' di abilità nello sviluppo (Visual Studio o anche Powershell) puoi deserializzare questo file nella classe originale, trovare le voci che vuoi rimuovere e re-serializzare il file.

Questo dovrebbe darti l'idea (lavorare su una copia del file .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);

Dopo la domanda di Adrian, l'ho provato di nuovo su una scatola Win7 x64 utilizzando Visual Studio 2010. Ho riscontrato lo stesso errore, quindi, dopo aver scavato un po', ho scoperto che ci volevano una serie di passaggi per risolverlo.

  1. Imposta la destinazione della piattaforma su 'x86' nelle proprietà del progetto
  2. aggiungi un riferimento a Microsoft.SqlServer.Management.SDK.SqlStudio (sulla mia scatola era in c:\Programmi\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Microsoft.SqlServer.Management .Sdk.SqlStudio.dll)
  3. aggiungi un riferimento a Microsoft.SqlServer.Management.UserSettings (nella stessa directory della precedente)
  4. esegui la risoluzione dell'assieme personalizzato

La risoluzione dell'assembly personalizzato ha richiesto un po' di lavoro poiché non era ovvio (almeno per me) perché CLR non risolvesse l'assembly correttamente e perché Visual Studio non mi permettesse di aggiungere il riferimento manualmente. Sto parlando di SqlWorkbench.Interfaces.dll.

Il codice aggiornato si presenta così:

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);
        }
    }