【发布时间】: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