1

我正在用 c# (.Net 3.5) 编写,我想获得安装在本地机器上的 SQL 版本。这意味着我没有包含地址\用户名\密码的连接字符串,我只需要本地机器上的 SQL 版本,而不需要从数据库等中检索数据。

我尝试使用“Microsoft.SqlServer.Management.Smo.Wmi ,但它似乎取决于 SQL 版本

有任何想法吗?谢谢,公里

编辑:一些笔记,

  • 我不想尝试/捕获每个 DLL “Microsoft.SqlServer.Management.Smo.Wmi”(不同的 SQL 版本有不同的 DLL)
  • 我需要的唯一细节是我正在运行的机器的 SQL 版本。
  • 我没有连接字符串/用户名/密码
4

2 回答 2

2

在 powershell 中试试这个:

Get-WmiObject -Namespace "root\Microsoft\SqlServer\ComputerManagement10" -Class SqlServiceAdvancedProperty -ComputerName <SERVERNAME> | Format-Table ServiceName, PropertyName, PropertyNumValue, PropertyStrValue -AutoSize

root\Microsoft\SqlServer\ComputerManagement10对 sql server 2008 及更高版本以及root\Microsoft\SqlServer\ComputerManagement2005使用命名空间。

您可以使用命名空间从 .net 实现此结果System.Management

更新

您可以使用它来检测安装了哪种 SQL Server WMI 提供程序。

public static IEnumerable<string> EnumCorrectWmiNameSpace()
{
    const string WMI_NAMESPACE_TO_USE = @"root\Microsoft\sqlserver";
    try
    {
        ManagementClass nsClass =
            new ManagementClass(
                new ManagementScope(WMI_NAMESPACE_TO_USE),
                new ManagementPath("__namespace"),
                null);

        return nsClass
            .GetInstances()
            .Cast<ManagementObject>()
            .Where(m => m["Name"].ToString().StartsWith("ComputerManagement"))
            .Select(ns => WMI_NAMESPACE_TO_USE + "\\" + ns["Name"].ToString());
    }
    catch (ManagementException e)
    {
        Console.WriteLine("Exception = " + e.Message);
    }

    return null;
}
于 2012-12-13T09:37:24.753 回答
0

如果您想获得安装在您机器上的 SQL Server Insance,您可以使用以下代码:

using Microsoft.SqlServer.Management.Smo.Wmi;
....

ManagedComputer mc = new ManagedComputer();

foreach (ServerInstance si in mc.ServerInstances)
{
     Console.WriteLine("The installed instance name is " + si.Name);
}

或者如果您想获得 SQL Server 版本,您可以使用以下代码:

try
{
    SqlConnection sqlConnection = new SqlConnection(connectionString);
    Microsoft.SqlServer.Management.Smo.Server server = new Microsoft.SqlServer.Management.Smo.Server(new Microsoft.SqlServer.Management.Common.ServerConnection(sqlConnection));

    switch (server.Information.Version.Major)
    {
      case 8:
        MessageBox.Show("SQL Server 2000");
        break;
      case 9:
        MessageBox.Show("SQL Server 2005");
        break;
      case 10:
        MessageBox.Show("SQL Server 2008");
                break;
      default:
        MessageBox.Show(string.Format("SQL Server {0}", server.Information.Version.Major.ToString())); 
        break;   
    }
}
catch (Microsoft.SqlServer.Management.Common.ConnectionFailureException)
{
    MessageBox.Show("Unable to connect to server",
        "Invalid Server", MessageBoxButtons.OK, MessageBoxIcon.Error);

}
于 2012-12-12T08:29:39.520 回答