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

Wie lösche ich Servereinträge im Bildschirm „Mit Server verbinden“ von SQL Server Management Studio?

Diese Datei scheint eine binäre serialisierte Version von Microsoft.SqlServer.Management.UserSettings.SqlStudio zu sein Klasse definiert in Microsoft.SqlServer.Management.UserSettings, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91 Assembly (befindet sich unter c:\Programme\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Microsoft.SqlServer.Management.UserSettings.dll ).

Mit ein wenig Entwicklungsgeschick (Visual Studio oder sogar Powershell) können Sie diese Datei in die ursprüngliche Klasse deserialisieren, die Einträge finden, die Sie entfernen möchten, und die Datei wieder neu serialisieren.

Das sollte Ihnen die Idee geben (Arbeiten an einer Kopie der .bin-Datei)...

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

Nach Adrians Frage habe ich dies erneut auf einer Win7 x64-Box mit Visual Studio 2010 versucht. Ich habe den gleichen Fehler gefunden, also habe ich nach ein wenig Graben festgestellt, dass es eine Reihe von Schritten zur Lösung brauchte.

  1. Setzen Sie das Plattformziel in den Projekteigenschaften auf „x86“
  2. Fügen Sie einen Verweis auf Microsoft.SqlServer.Management.SDK.SqlStudio hinzu (auf meiner Box war dies unter c:\Programme\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Microsoft.SqlServer.Management .Sdk.SqlStudio.dll)
  3. Fügen Sie einen Verweis auf Microsoft.SqlServer.Management.UserSettings hinzu (im selben Verzeichnis wie das vorherige)
  4. benutzerdefinierte Assemblyauflösung durchführen

Die Auflösung der benutzerdefinierten Assembly hat ein wenig Arbeit gekostet, da es (zumindest für mich) nicht offensichtlich war, warum die CLR die Assembly nicht einfach korrekt auflösen würde und warum Visual Studio mir nicht erlauben würde, den Verweis manuell hinzuzufügen. Ich spreche von der SqlWorkbench.Interfaces.dll.

Der aktualisierte Code sieht folgendermaßen aus:

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