【问题标题】:change tcp/ip port for sql server express using C#使用 C# 更改 sql server express 的 tcp/ip 端口
【发布时间】:2013-04-10 15:55:56
【问题描述】:

我正在使用我的应用程序部署 SQL Server Express,并且我需要 C# 代码来更改 TCP/IP 属性,而无需在 SQL Server 配置管理器中更改它们。

以下代码停止 SQL Server,然后将 tcp 端口更改为 1433,然后再次启动 SQL Server。该代码在 Windows XP 机器上运行良好;但是,它在 Windows 7 机器上出错。错误发生在prot.Alter(); 行。

try
{
    Service Mysvc = mc.Services["MSSQL$SQL" + machineName];

    if (Mysvc.ServiceState == ServiceState.Running)
    {
       MessageBox.Show("Stopping Service","PMP");
       Mysvc.Stop();
    }

    ServerInstance s = mc.ServerInstances["SQL" + machineName];
    ServerProtocol prot = s.ServerProtocols["Tcp"];
    prot.IPAddresses[0].IPAddressProperties["TcpPort"].Value = "1433";
    prot.Alter();

    MessageBox.Show("Starting Service","PMP");
    Mysvc.Start();
}
catch (Exception e)
{
    MessageBox.Show("Error in setting TCP Port " + e.ToString(),"PMP");
}

当我在 Windows 7 机器上运行它时收到以下错误消息:

SqlServer.Management.Smo.FailedOperationException:更改失败。 ---> Microsoft.SqlServer.Management.Smo.FailedOperationException:ServerIPAddress 'IPAll' 的 SetStringValue 失败。 ---> System.NullReferenceException:对象引用未设置为对象的实例。
在 System.Management.ManagementObject.MapOutParameters(Object[] args, ManagementBaseObject >outParams, IWbemClassObjectFreeThreaded outParamsClass)
在 System.Management.ManagementObject.InvokeMethod(String methodName, Object[] args)
在 Microsoft.SqlServer.Management.Smo.Wmi.WmiSmoObject.InvokeMgmtMethod(ManagementObject mo, >ManagementOperationObserver 观察者, String methodName, Object[] 参数)

--- 内部异常堆栈跟踪结束 ---
在 Microsoft.SqlServer.Management.Smo.Wmi.WmiSmoObject.InvokeMgmtMethod(ManagementObject mo, >ManagementOperationObserver 观察者, String methodName, Object[] 参数)
在 Microsoft.SqlServer.Management.Smo.Wmi.WmiSmoObject.AlterProtocolProperties (ProtocolPropertyCollection 协议属性)
在 Microsoft.SqlServer.Management.Smo.Wmi.ServerIPAddress.AlterImplWorker()
--- 内部异常堆栈跟踪结束 ---
在 Microsoft.SqlServer.Management.Smo.Wmi.ServerIPAddress.AlterImplWorker()
在 Microsoft.SqlServer.Management.Smo.Wmi.ServerProtocol.AlterImplWorker()
在 Microsoft.SqlServer.Management.Smo.Wmi.ProtocolBase.Alter()
--- 内部异常堆栈跟踪结束 ---
在 Microsoft.SqlServer.Management.Smo.Wmi.ProtocolBase.Alter()

【问题讨论】:

  • 好吧,当你调用这样的东西:Service Mysvc = mc.Services["MSSQL$SQL" + machineName];,你应该总是检查返回的值(Mysvc)是否真的!= null 而不仅仅是调用其他方法!很可能,您的 SQL Server 服务在 Windows 7 上具有不同的名称,因此此调用不会返回任何内容,但您随后会在其上调用 Mysvc.ServiceState...
  • 那么你发现了吗?是 UAC/海拔问题吗?
  • UAC 是这里的问题,以管理员身份运行解决了问题。

标签: c# sql-server-2008 tcp


【解决方案1】:

UAC 是这里的问题。以管理员身份运行将解决此问题。

【讨论】:

    【解决方案2】:

    Service 类不允许您在继续下一步操作之前等待服务启动或停止。正如您的代码所代表的那样,服务会收到一个停止命令,但会在服务停止之前继续执行。

    你可以通过重构ServiceController类来解决这个问题:

    using Microsoft.SqlServer.Management.Smo.Wmi;
    
    const string instanceName = "SQLEXPRESS";
    
    var managedComputer = new ManagedComputer();
    
    var serviceController = new ServiceController(string.Concat("MSSQL$", instanceName));
    
    var serverInstance = managedComputer.ServerInstances[instanceName];
    
    var serverProtocol = serverInstance?.ServerProtocols["Tcp"];
    
    var ipAddresses = serverProtocol?.IPAddresses;
    
    if (ipAddresses != null)
    {
        for (var i = 0; i < ipAddresses?.Count; i++)
        {
            var ipAddress = ipAddresses[i];
    
            if (!string.Equals(ipAddress.Name, "IPAll"))
            {
                continue;
            }
    
            if (serviceController.Status == ServiceControllerStatus.Running)
            {
                serviceController.Stop();
    
                serviceController.WaitForStatus(ServiceControllerStatus.Stopped);
            }
    
            ipAddress.IPAddressProperties["TcpDynamicPorts"].Value = "0";
            ipAddress.IPAddressProperties["TcpPort"].Value = "1433";
    
            serverProtocol.Alter();
    
            break;
        }
    }
    
    if (serviceController.Status == ServiceControllerStatus.Running)
    {
        return;
    }
    
    serviceController.Start();
    
    serviceController.WaitForStatus(ServiceControllerStatus.Running);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-19
      相关资源
      最近更新 更多