sql >> Base de Datos >  >> Database Tools >> SSMS

¿Cómo eliminar las entradas del servidor en la pantalla Conectar al servidor de SQL Server Management Studio?

Parece que este archivo es una versión serializada binaria de Microsoft.SqlServer.Management.UserSettings.SqlStudio clase definida en Microsoft.SqlServer.Management.UserSettings, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91 ensamblado (ubicado en c:\Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Microsoft.SqlServer.Management.UserSettings.dll ).

Con un poco de habilidad de desarrollo (Visual Studio o incluso Powershell), puede deserializar este archivo en la clase original, encontrar las entradas que desea eliminar y volver a serializar el archivo.

Esto debería darle una idea (trabajando en una copia del archivo .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);

Después de la pregunta de Adrian, intenté esto nuevamente en un cuadro Win7 x64 usando Visual Studio 2010. Encontré el mismo error, así que, después de investigar un poco, descubrí que tomó una serie de pasos para resolverlo.

  1. Establezca el objetivo de la plataforma en 'x86' en las propiedades del proyecto
  2. agregue una referencia a Microsoft.SqlServer.Management.SDK.SqlStudio (en mi caja estaba en c:\Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Microsoft.SqlServer.Management .Sdk.SqlStudio.dll)
  3. añadir una referencia a Microsoft.SqlServer.Management.UserSettings (en el mismo directorio que el anterior)
  4. realizar una resolución de ensamblaje personalizada

La resolución del ensamblaje personalizado tomó un poco de trabajo ya que no era obvio (al menos para mí) por qué CLR no resolvería el ensamblaje correctamente y por qué Visual Studio no me permitiría agregar la referencia manualmente. Estoy hablando de SqlWorkbench.Interfaces.dll.

El código actualizado se ve así:

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