如何在SQL Server Management Studio的"连接到服务器"屏幕中删除服务器条目?

Adr*_*iro 33 sql-server ssms sql-server-2008

可能重复:
如何从SQL Server Management Studio的历史记录中删除"服务器名称"项

在"连接到服务器"屏幕中,SQL Server Management Studio存储您为服务器名称,登录名和密码输入的所有条目.这非常有用,但有时情况发生变化,服务器地址发生变化,数据库不再可用.

如何从此屏幕删除服务器条目?此外,当您选择服务器时,列表中会提供过去的登录信息.再一次,这些变化.如何删除用户条目?

连接到服务器屏幕

arc*_*dev 40

看起来这个文件是Microsoft.SqlServer.Management.UserSettings.SqlStudioMicrosoft.SqlServer.Management.UserSettings,Version = 10.0.0.0,Culture = neutral,PublicKeyToken = 89845dcd8080cc91程序集中定义的类的二进制序列化版本(位于c:\ Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Microsoft.SqlServer.Management.UserSettings.dll).

通过一些开发技巧(Visual Studio甚至Powershell),您可以将此文件反序列化为原始类,找到要删除的条目并重新序列化该文件.

这应该给你的想法(处理.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);
Run Code Online (Sandbox Code Playgroud)

在Adrian的问题之后,我在使用Visual Studio 2010的Win7 x64盒子上再次尝试了这个.我发现了同样的错误,所以在挖掘了一下后我发现它需要一些步骤来解决.

  1. 在项目属性中将平台目标设置为"x86"
  2. 添加对Microsoft.SqlServer.Management.SDK.SqlStudio的引用(在我的框中,这是在c:\ Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Microsoft.SqlServer.Management.Sdk. SqlStudio.dll)
  3. 添加对Microsoft.SqlServer.Management.UserSettings的引用(在前一个目录中的相同目录中)
  4. 执行自定义装配分辨率

自定义程序集解决方案需要做一些事情,因为它(至少对我来说)不明显为什么CLR不能正确解析程序集以及为什么Visual Studio不允许我手动添加引用.我在谈论SqlWorkbench.Interfaces.dll.

更新后的代码如下所示:

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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 我为此创建了一个小UI.它允许删除服务器或仅从服务器登录.它在覆盖之前备份.它在这里:http://ssmsmru.codeplex.com/ (28认同)
  • 我已将我的UI代码放在CodePlex上:https://ssmsmru.codeplex.com/因为它似乎对它有一点兴趣. (6认同)
  • @Mark - 很棒.谢谢 (2认同)

Mic*_*mes 3

不幸的是,仅删除某些项目似乎是不可能的(或至少不可行)。

但是,如果需要,您可以重置配置并从头开始。

确保 Management Studio 已关闭,然后删除或重命名此文件:

%APPDATA%\Microsoft\Microsoft SQL Server\100\Tools\Shell\SqlStudio.bin
Run Code Online (Sandbox Code Playgroud)

请注意,该文件包含其他用户首选项设置,因此如果您自定义了 Management Studio 配置,则需要进行一些恢复工作。

参考: http://social.msdn.microsoft.com/Forums/en-US/sqltools/thread/94e5c3ca-c76d-48d0-ad96-8348883e8db8/

祝你好运!


归档时间:

查看次数:

18319 次

最近记录:

13 年,10 月 前