Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以编程方式更改SQL Server设置_C#_Sql Server - Fatal编程技术网

C# 以编程方式更改SQL Server设置

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 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设置等

谁能在这方面给我提供帮助,我怎么做


感谢您与我们分享宝贵的时间。

您应该使用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?