2011-08-25 199 views
1

我GOOGLE了一天,但问题仍然是一个问题:如何检测SQ​​L Server 2008 R2上的各种Windows版本:检测SQL Server 2008 R2的

  • 通过注册表(将是我们最喜欢的溶液) ,
  • 通过 文件系统
  • ,通过安装退出代码

使用NSIS开发安装程序。一些额外的信息:

注册

样品在网络上已经过时或者干脆不恰当的。不仅仅是R2而且2k8检测也是有问题的。

文件系统

我不知道哪些文件特别是从2K8 R2。

安装退出代码

在一些情况下退出而不错误代码(即缺少的先决条件)。

+0

谢谢大家!我们需要将它集成到NSIS安装程序中,但是我会在测试不同环境下的解决方案后提供反馈。 – boj

回答

2

你可以使用WMI来listy安装的所有微软产品,然后你可以看看敌人,是一个需要

public static class MyClass 
    { 
     public static void Main() 
     { 
      ManagementObjectSearcher mos = new ManagementObjectSearcher("SELECT * FROM Win32_Product"); 
      foreach (ManagementObject mo in mos.Get()) 
      { 
       Console.WriteLine(mo["Name"]); 
      } 


     } 
    } 
+0

一个非常酷,很慢的解决方案 - 但我决定使用这个。 SELECT @@ VERSION非常流畅,但需要SQL连接。 – boj

2

尝试执行此查询:

SELECT @@Version 

我得到这样的结果回:

的Microsoft SQL Server 2008 R2(RTM) - 10.50.1600.1(X64)四月2 2010 15:48:46 Copyright(c)Microsoft Corporation企业版 (64位)在Windows NT 5.2(内部版本3790:Service Pack 2)

这就够了吗?对我来说,是:)

+0

如果服务未启动,该怎么办?你是如何确定要连接哪个实例以运行查询的? –

+0

@Aaron,有你,看到我的其他答案 –

1

,并尝试执行由达维德提供查询之前(SELECT @ @版本),你可以检查,这MSSQL服务运行

using System.ServiceProcess; 
var list = ServiceController.GetServices().ToList(); 
     if (list.Any(sc => sc.ServiceName.ToLower().Contains("mssql"))) 
+0

您仍然需要识别需要连接的实例名称 - 因为可能安装了多个实例。知道至少有一项服务已经启动并不意味着你会奇迹般地知道分别连接到每个实例并检查@@ VERSION。 –

+0

亚伦,你有权利,但如果你甚至知道实例名称 - 我认为如果MSSQL正在运行,然后执行连接比连接到服务器并等待服务器处于脱机状态时超时更快,那么此metod会更快。 –

+0

那么你想要快速还是准确?关键是你需要知道任何已安装实例的版本,而不管它们是否正在运行。 –

2

看看它有多种方法老SQLPing源代码

+0

+1你需要检查所有可能的实例,然后才能考虑检查它们是什么版本。 –

1

我我们下文E代码在我的应用

SqlDataSourceEnumerator sqldatasourceenumerator1 = SqlDataSourceEnumerator.Instance; 
      DataTable datatable1 = sqldatasourceenumerator1.GetDataSources(); 
      foreach (DataRow row in datatable1.Rows) 
      { 
       if (Environment.MachineName.Equals(row["ServerName"])) 
       { 

        isSqlServerPresent = true; 
        break; 
       } 
      } 

唯一的问题是,这种代码的工作,当机器在网络上,但因为在我的情况下,该机将会在网络,所以我很确定这个问题。

它使我得到SQL Server的本地实例。