2011-06-03 72 views
32

可能重复:
How to remove “Server name” items from history of SQL Server Management Studio如何删除SQL Server Management Studio的“连接到服务器”屏幕中的服务器条目?

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

如何从此屏幕删除服务器条目?另外,当您选择一台服务器时,列表中可以使用过去的登录。这些改变再一次。我如何删除用户条目?

Connect to Server screen

回答

3

不幸的是,它似乎并没有能够(或至少实用),只除去某些项目。

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

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

%APPDATA%\Microsoft\Microsoft SQL Server\100\Tools\Shell\SqlStudio.bin 

请注意,该文件包含其他用户偏好设置,因此,如果您自定义Management Studio中的配置,你就会有一些工作要恢复它们。

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

祝你好运!

+1

Microsoft无法将其作为XML文件吗?那会有多难? :( 那么,因为我会失去*每个*定制和*所有*项目,我想我什至不想再这样做 – 2011-06-03 19:20:21

+0

是的,很臭,我查找有关SqlStudio.bin格式/可编辑性的信息,但找不到任何东西。唉。 – 2011-06-03 19:51:07

+1

为了将来对这个问题的参考,我编辑了你的答案,以便读者知道前面它不能完成,然后提供替代解决方案,然后我接受了。 – 2011-06-03 19:59:25

38

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

阿德里安的问题后,我使用Visual Studio 2010年我再次尝试这个在Win7的X64箱发现了同样的错误,所以挖了一下后,我发现它需要一些步骤来解决。

  1. 设置目标平台为“86”在项目属性
  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); 
     } 
    } 
+0

这是纯金! '运行一些测试,这是惊人的!我会让你张贴在我的发展...... – 2011-06-16 16:05:17

+1

'binaryFormatter.Serialize(outStream,settings);'抛出一个异常:'类型'System.Runtime.Serialization.TypeLoadExceptionHolder'in Assembly' mscorlib,Ve rsion = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'没有标记为serializable.'你知道我可以如何序列化回bin文件吗? – 2011-06-16 16:17:15

+0

非常感谢。像魅力一样工作。 – Beniamin 2011-09-16 09:46:47

5

我把代码@ arcticdev的帖子,并把它变成一个控制台应用程序。它可以下载here。该应用程序预计SqlStudio.bin位于应用程序在中运行的文件夹中,并将覆盖它(备份!!)并将服务器名称作为参数。

在Windows 7(x64)和SSMS 2008上测试。

相关问题