【问题标题】:Detect SQL Server 2008 R2检测 SQL Server 2008 R2
【发布时间】:2011-08-25 09:53:33
【问题描述】:

我已经用谷歌搜索了一天,但问题仍然存在:如何在各种 Windows 版本上检测 SQL Server 2008 R2:

  • 通过registry(将是我们最喜欢的解决方案),
  • 通过文件系统
  • 通过安装程序退出代码

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

注册表

网上的样本已过时或根本不正确。不只是 R2,2k8 检测也有问题。

文件系统

我不知道哪些文件特别来自 2k8 R2。

安装程序退出代码

在某些情况下退出时没有错误代码(即缺少先决条件)。

【问题讨论】:

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

标签: c# .net sql-server-2008 registry nsis


【解决方案1】:

您可以使用 WMI 列出所有已安装的 Microsoft 产品,然后您可以查找所需的产品

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"]);
            }


        }
    }

【讨论】:

  • 一个非常酷且非常慢的解决方案 - 但我决定使用它。 SELECT @@VERSION 很流畅但是需要SQL连接。
【解决方案2】:

尝试执行这个查询:

SELECT @@Version

我得到了这个结果:

Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) 2010 年 4 月 2 日 15:48:46 版权所有 (c) Microsoft Corporation Enterprise Edition (64 位)在 Windows NT 5.2(内部版本 3790:Service Pack 2)上

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

【讨论】:

  • 服务没有启动怎么办?您如何确定要连接到哪个实例才能运行查询?
  • @Aaron,知道了,看看我的其他答案
【解决方案3】:

查看旧的SQLPing源代码,其中有多种方法

【讨论】:

  • +1 您需要检查所有可能的实例,然后才能考虑检查它们是什么版本。
【解决方案4】:

在您尝试执行 Davide (SELECT @@Version) 提供的查询之前,您可以检查 MSSQL 服务是否正在运行

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

【讨论】:

  • 您仍然需要确定您需要连接的实例名称 - 因为可能安装了多个实例。知道至少启动了一项服务并不意味着您会神奇地知道单独连接到每个实例并检查@@VERSION。
  • Aaron,你是对的,但如果你知道实例名称 - 我认为这个方法更快地检查 MSSQL 是否正在运行然后进行连接,而不是连接到服务器并等待服务器超时离线。
  • 那么您想要快速还是准确?关键是您需要知道任何已安装实例的版本,无论它们当前是否正在运行。
【解决方案5】:

我在我的应用程序中使用以下代码

 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 的本地实例。

【讨论】:

    【解决方案6】:

    事实上,如果你想列出网络中的服务器和机器或局域网上的 SQL Server 实例,有相应的 API。

    应该有正确的方式调用NetServerEnum Windows API,例子见:

    http://www.xtremevbtalk.com/showthread.php?t=107256

    http://pinvoke.net/default.aspx/netapi32/netserverenum.html

    【讨论】:

      【解决方案7】:
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-20
      • 2018-03-06
      • 1970-01-01
      • 2013-02-07
      相关资源
      最近更新 更多