C# 检测SQL Server 2008 R2

C# 检测SQL Server 2008 R2,c#,.net,sql-server-2008,registry,nsis,C#,.net,Sql Server 2008,Registry,Nsis,我在谷歌上搜索了一天,但问题仍然是:如何在各种Windows版本上检测SQL Server 2008 R2: via registry将是我们最喜欢的解决方案, 通过文件系统, 通过安装程序退出代码? 使用NSIS开发的安装程序。其他一些信息: 登记处 网上的样品已经过时或根本不合适。不仅仅是R2,2k8检测也有问题 文件系统 我不知道什么文件是特别从2k8 R2 安装程序退出代码 在某些情况下,退出时没有错误代码,即缺少先决条件。尝试执行此查询: SELECT @@Version 我得到了这

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

via registry将是我们最喜欢的解决方案, 通过文件系统, 通过安装程序退出代码? 使用NSIS开发的安装程序。其他一些信息:

登记处

网上的样品已经过时或根本不合适。不仅仅是R2,2k8检测也有问题

文件系统

我不知道什么文件是特别从2k8 R2

安装程序退出代码


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

尝试执行此查询:

SELECT @@Version
我得到了这个结果:

Microsoft SQL Server 2008 R2 RTM-10.50.1600.1 X64 2010年4月2日 15:48:46版权所有c微软公司企业版 Windows NT 5.2版本3790上的64位:Service Pack 2


这够了吗?对我来说是:

尝试执行此查询:

SELECT @@Version
我得到了这个结果:

Microsoft SQL Server 2008 R2 RTM-10.50.1600.1 X64 2010年4月2日 15:48:46版权所有c微软公司企业版 Windows NT 5.2版本3790上的64位:Service Pack 2


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

您可以使用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"]);
            }


        }
    }

您可以使用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"]);
            }


        }
    }

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

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

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

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

查看具有多种方法的较旧源代码

查看具有多种方法的较旧源代码

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

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

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

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

事实上,如果您想列出网络中的服务器以及计算机或LAN上的SQL Server实例,则有相应的API

应该有适当的方法调用NetServerEnum Windows API,例如,请参阅:


事实上,如果您想列出网络中的服务器以及计算机或LAN上的SQL Server实例,那么就有相应的API

应该有适当的方法调用NetServerEnum Windows API,例如,请参阅:


您仍然需要确定需要连接到的实例名称,因为可能安装了多个实例。知道至少有一个服务已启动并不意味着您将神奇地知道单独连接到每个实例并检查@@VERSION.亚伦,您是对的,但若你们知道实例名,我认为这种方法在MSSQL运行的情况下比连接到服务器并等待超时(若服务器离线)更快。你们想要快速还是准确?关键是,您需要知道安装的任何实例的版本,无论它们当前是否正在运行。您仍然需要标识需要连接到的实例名称,因为可能安装了多个实例。知道至少有一个服务已启动并不意味着您将神奇地知道单独连接到每个实例并检查@@VERSION.亚伦,您是对的,但若你们知道实例名,我认为这种方法在MSSQL运行的情况下比连接到服务器并等待超时(若服务器离线)更快。你们想要快速还是准确?关键是您需要知道安装的任何实例的版本,无论它们当前是否正在运行。+1您需要检查所有可能的实例,然后才能考虑检查它们的版本。+1您需要检查所有可能的实例,然后才能考虑检查它们的版本。如果服务未启动,该怎么办?为了运行查询,您是如何确定要连接到哪个实例的?@Aaron,明白了,请参阅我的另一个答案如果服务未启动怎么办?为了运行查询,您是如何确定要连接到哪个实例的?@Aaron,明白了,请参阅我的其他答案谢谢大家!我们需要将其集成到NSIS安装程序中,但我会在不同环境中测试解决方案后提供反馈。谢谢大家!我们需要将它集成到NSIS安装程序中,但我会在不同环境中测试解决方案后提供反馈。这是一个非常酷、速度非常慢的解决方案,但我决定使用它。SELECT@@版本非常平滑,但需要SQL连接。这是一个非常酷而且非常慢的解决方案 -但我决定用这个。选择@版本非常平滑,但需要SQL连接。