可能重复:
How to remove “Server name” items from history of SQL Server Management Studio
在“连接到服务器”屏幕中,SQL Server Management Studio存储您为服务器名称,登录名和密码输入的所有条目。这非常有用,但有时情况发生变化,服务器地址发生变化,数据库不再可用。
如何从此屏幕删除服务器条目?此外,当您选择服务器时,列表中会提供过去的登录信息。再一次,这些变化。如何删除用户条目?
答案 0 :(得分:39)
看起来这个文件是 Microsoft.SqlServer.Management.UserSettings,Version = 10.0.0.0,Culture = neutral,PublicKeyToken = 89845dcd8080cc91 Microsoft.SqlServer.Management.UserSettings.SqlStudio类的二进制序列化版本>程序集(位于 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盒子上再次尝试了这个。我发现了同样的错误,所以在挖掘了一下之后我发现需要花费很多步骤才能解决。
自定义程序集解决方案需要做一些事情,因为它不明显(至少对我来说)为什么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);
}
}
答案 1 :(得分:5)
我从@ arcticdev的帖子中获取了代码并将其转换为控制台应用程序。它可以下载here。应用程序希望SqlStudio.bin
位于应用程序在中运行的文件夹中,并且会覆盖它(备份!!)并将服务器名称作为参数。
在Windows 7(x64)和SSMS 2008上测试。
答案 2 :(得分: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/
祝你好运!