Обнаружение установки локального сервера SQL с помощью C # (32-разрядной и 64-разрядной) - PullRequest
3 голосов
/ 03 августа 2009

Как я могу определить, установлен ли SQL на локальном компьютере с использованием C #? Можно ли проверить удаленную машину?

Ответы [ 8 ]

4 голосов
/ 26 февраля 2013

У вас есть несколько способов сделать это:

  • SmoApplication.EnumAvailableSqlServers ()
  • SqlDataSourceEnumerator.Instance
  • Прямой доступ к системному реестру

Прямой доступ не является рекомендуемым решением MS, поскольку они могут изменять ключи / пути. Но другие решения не дают экземпляров на 64-битных платформах.

Поэтому я предпочитаю проверять экземпляры SQL Server в системном реестре. При этом следует учитывать разницу в доступе к реестру между платформами x86 и x64 . Windows 64-bit хранит данные в разных частях системного реестра и объединяет их в представления. Поэтому использование RegistryView (доступно с версии .NET 4) крайне важно.

using Microsoft.Win32;

RegistryView registryView = Environment.Is64BitOperatingSystem ? RegistryView.Registry64 : RegistryView.Registry32;
using (RegistryKey hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, registryView))
{
    RegistryKey instanceKey = hklm.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL", false);
    if (instanceKey != null)
    {
        foreach (var instanceName in instanceKey.GetValueNames())
        {
            Console.WriteLine(Environment.MachineName + @"\" + instanceName);
        }
    }
}

Если вы ищете 32-битные экземпляры в 64-битной ОС (довольно странно, но возможно), вам нужно будет посмотреть:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server
2 голосов
/ 03 августа 2009

Мы проверяем реестр для этого

Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\CurrentVersion", ", "0.0.0.0");
2 голосов
/ 03 августа 2009

Вы можете проверить путь в реестре

HKEY_LOCAL_MACHINE \ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ Microsoft \ Microsoft SQL Server \ InstalledInstances

Пример кода, который выполняет аналогичную работу, см. В этом вопросе Как получить-SQL-сервер-путь-установки-программно

Также см. MSDN: Расположение файлов для именованных экземпляров SQL Server по умолчанию и для получения дополнительной информации о ключах реестра, используемых SQL Server.

1 голос
/ 03 августа 2009

Возможно, вы найдете следующее полезным. Первый способ используется для поиска серверов (локальных и сетевых), а второй - для перечисления баз данных на каждом сервере.

using System;
using System.Collections.Generic;
using System.Data.Sql;
using System.Data;
using System.Data.SqlClient;

namespace Info.Data.Engine.SQLServer
{
  public static class SQLServerHelper
  {
    public static List<String> EnumerateServers()
    {
      var instances = SqlDataSourceEnumerator.Instance.GetDataSources();
      if ((instances == null) || (instances.Rows.Count < 1)) return null;

      var result = new List<String>();
      foreach (DataRow instance in instances.Rows)
      {
        var serverName = instance["ServerName"].ToString();
        var instanceName = instance["InstanceName"].ToString();
        result.Add(String.IsNullOrEmpty(instanceName) ? serverName : String.Format(@"{0}\{1}", serverName, instanceName));
      }
      return result;
    }

    public static List<String> EnumerateDatabases(String connectionString)
    {
      try
      {
        using (var connection = new SqlConnection(connectionString))
        {
          connection.Open();
          var databases = connection.GetSchema("Databases");
          connection.Close();
          if ((databases == null) || (databases.Rows.Count < 1)) return null;

          var result = new List<String>();
          foreach (DataRow database in databases.Rows)
          {
            result.Add(database["database_name"].ToString());
          }
          return result;
        }
      }
      catch
      {
        return null;
      }
    }
  }
}

НТН, Деян

1 голос
/ 03 августа 2009

Вам понадобится Redist обратной совместимости SQL 2005. См .: Как подключиться к Sqlserver2008 с помощью SMO, какой обходной путь должен быть сделан?

using Microsoft.SqlServer.Management.Smo;

DataTable dt = SmoApplication.EnumAvailableSqlServers(true);
         string[] szSQLInstanceNames = new string[dt.Rows.Count];
         StringBuilder szSQLData = new StringBuilder();

         if (dt.Rows.Count > 0)
         {
            int i = 0;
            foreach (DataRow dr in dt.Rows)
            {
               try
               {
                  szSQLInstanceNames[i] = dr["Name"].ToString();
                  Server oServer;
                  oServer = new Server(szSQLInstanceNames[i]);
                  if (string.IsNullOrEmpty(dr["Instance"].ToString()))
                  {
                     szSQLInstanceNames[i] = szSQLInstanceNames[i] + "\\MSSQLSERVER";
                  }
                  szSQLData.AppendLine(szSQLInstanceNames[i] + "  Version: " + oServer.Information.Version.Major + "  Service Pack: " + oServer.Information.ProductLevel + "  Edition: " + oServer.Information.Edition + "  Collation: " + oServer.Information.Collation);
               }
               catch (Exception Ex)
               {
                  szSQLData.AppendLine("Exception occured while connecting to " + szSQLInstanceNames[i] + " " + Ex.Message);
               }

               i++;
            }

Примечание: если вы просто хотите посмотреть, установлен ли по умолчанию intance или нет, просто сделайте:

Сервер oServer; oServer = новый сервер (Environment.MAchineName);

если не выдается исключение, SQL существует.

1 голос
/ 03 августа 2009

Вы можете использовать пространство имен System.Management для проверки существования SQL Server в запущенных службах сервера.

0 голосов
/ 09 мая 2011

Большое спасибо Деяну Станичу.
И я хотел бы добавить больше критериев поиска:

Проверьте, установлен ли SQL Server 2008 на локальном компьютере в .net sqlclient

0 голосов
/ 03 августа 2009

Вы можете просто открыть соединение с машиной и закрыть его. Если вы бросаете исключение, это достойный знак. Я понимаю, что это не супер чистый, но это сделает работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...