C# 以编程方式更改SQL Server设置
我请你仔细阅读我的问题 您可能知道,在使用SQL Server Express edition安装VS2005/2008时,默认情况下SQL Server在Windows身份验证模式下运行。您可以使用SQL Server Management Studio将模式更改为混合模式Windows和SQL Server身份验证模式 类似地,要允许通过TCP/IP进行SQL Server远程连接,您需要使用SQL Server Configuration Manager,然后为SQLEXPRESS选择协议,然后更改TCP/IP选项的设置 我需要的是使用C以编程方式自动化这个过程。也就是说,我需要编写一个C程序来更改模式或更改tcp/ip设置等 谁能在这方面给我提供帮助,我怎么做C# 以编程方式更改SQL Server设置,c#,sql-server,C#,Sql Server,我请你仔细阅读我的问题 您可能知道,在使用SQL Server Express edition安装VS2005/2008时,默认情况下SQL Server在Windows身份验证模式下运行。您可以使用SQL Server Management Studio将模式更改为混合模式Windows和SQL Server身份验证模式 类似地,要允许通过TCP/IP进行SQL Server远程连接,您需要使用SQL Server Configuration Manager,然后为SQLEXPRESS选择协议
感谢您与我们分享宝贵的时间。您应该使用SQL Server管理对象-这是一个用于以编程方式管理SQL Server的API 更新: 很遗憾,这有点棘手:Server.LoginMode读/写、Server.TcpEnabled和Server.NamedPipesEnabled只能获取。为了修改协议,您需要检查Microsoft.SqlServer.Management.Smo.Wmi命名空间,因此从“另一端”开始: ServerProtocol-表示服务器协议 ServerProtocolCollection—在给定服务器上定义的所有协议的集合
我认为使用安装过程中的配置文件进行SQL Server Express edition的静默安装可以解决您的问题 在链接中,您可以找到安装的命令行参数
在中,您可以找到如何创建配置文件。如何修改注册表 客户端协议设置存储在此处: HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0 查看ProtocolOrder 身份验证模式存储在此处: HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQL Server\LoginMode 见:
C中的此函数将启用TCP/IP协议,并将登录模式设置为混合模式 见补充资料 代码如下:
private static bool SetServerProperties()
{
#region standardize Connection String
string tempCatalog = "master";
string temp = @"Data Source=" + dataSource + ";Initial Catalog=" + tempCatalog + ";Integrated Security=True;MultipleActiveResultSets=True";
#endregion
SqlConnection sqlconnection = new SqlConnection(temp);
SqlCommand cmd = new SqlCommand("select @@ServerName", sqlconnection);
sqlconnection.Open();
string serverName = "";
try
{
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
serverName = dr[0].ToString();
}
catch
{
MessageBox.Show("Failed to Set SQL Server Properties for remote connections.");
}
Server srv = new Server(serverName);
srv.ConnectionContext.Connect();
srv.Settings.LoginMode = ServerLoginMode.Mixed;
ManagedComputer mc = new ManagedComputer();
try
{
Service Mysvc = mc.Services["MSSQL$" + serverName.Split('\\')[1]];
if (Mysvc.ServiceState == ServiceState.Running)
{
Mysvc.Stop();
Mysvc.Alter();
while (!(string.Format("{0}", Mysvc.ServiceState) == "Stopped"))
{
Mysvc.Refresh();
}
}
ServerProtocol srvprcl = mc.ServerInstances[0].ServerProtocols[2];
srvprcl.IsEnabled = true;
srvprcl.Alter();
Mysvc.Start();
Mysvc.Alter();
while (!(string.Format("{0}", Mysvc.ServiceState) == "Running"))
{
Mysvc.Refresh();
}
return true;
}
catch
{
MessageBox.Show("TCP/IP connectin could not be enabled.");
return false;
}
}
通过从C执行以下存储过程,我能够以较小的占用空间完成此操作:
USE [master]
EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'LoginMode', REG_DWORD, 2
GO
它看起来不太像,但可以完美、即时地工作,无需重新启动服务。感谢Alex的快速回复。本打算提出这一建议,但我还没有发现在SMO中可以更改连接协议的地方。但是,这是最有可能找到它们的地方。谢谢Will,我将尝试深入了解SMO。Alex我应该从哪里获得这个SMO,或者更确切地说,我应该使用哪个程序集来获得c语言的编程支持?实际上,你需要一堆SMO程序集。它们自然随SQL Server一起提供,但可以单独安装。看这篇文章:谢谢乔纳森,但我不想那样。因为我需要更改已安装产品的设置。哦!好的,祝你好运!亚历克斯的答案看起来是一个很好的起点。谢谢老兄!这似乎是另一件好事。这是一个很棒的解决方案,需要做几件事:1添加对Microsoft.SqlServer.ConnectionInfo、Microsoft.SqlServer.Management.Sdk.Sfc、Microsoft.SqlServer.Smo、Microsoft.SqlServer.SqlEnum、Microsoft.SqlServer.SqlWmiManagement的引用,在C:\Program Files x86\Microsoft SQL Server\100\SDK\Assemblys 2中可以找到Microsoft.SqlServer.WmiEnum,使用Microsoft.SqlServer.Management.Smo和Microsoft.SqlServer.Management.Smo.Wmi.Great solution添加。除了@PaulyGlott comment,我还需要添加一行:srv.Settings.Alter;在srv.Settings.LoginMode=ServerLoginMode.Mixed;之后;,否则,它将无法保存更改的设置。谢谢Chris,但是您现在回答这个问题似乎太晚了。这是否也应该更改TCPIP和命名管道?还是只将ServerLoginMode更改为Mixed?