sql-server - 如何删除 SQL Server Management Studio "Connect to Server"屏幕中的服务器条目?

标签 sql-server sql-server-2008 ssms

Possible Duplicate:
How to remove “Server name” items from history of SQL Server Management Studio

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

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

Connect to Server screen

最佳答案

看起来此文件是 Microsoft.SqlServer.Management.UserSettings 中定义的 Microsoft.SqlServer.Management.UserSettings.SqlStudio 类的二进制序列化版本,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);

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

关于sql-server - 如何删除 SQL Server Management Studio "Connect to Server"屏幕中的服务器条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6230159/

相关文章:

sql-server - 使用 SQLAlchemy 连接到 SQL Server

sql-server-2008 - 是否可以通过 "turn off"查询来更新 Entity Framework 中的标识列

sql-server-2008 - 搜索字符串变量然后在 PowerShell 中运行条件语句

sql - 在 Management Studio 中创建 CHANGE 脚本?

sql-server - 如何解释此 SQL Server 错误消息

PHP/PDO/MSSQL 如何获取错误信息?

sql-server - SQL UDF 返回日期数组

sql - 在 SQL Server 中将每三行分组为一组

sql - 想要透视表。并生成动态 SQL 字符串并执行

sql-server - 使用 SQL Management Studio 将文件上传到 varbinary