Установленные экземпляры не работают - PullRequest
4 голосов
/ 21 августа 2011

У меня есть проект с базой данных, и мне нужно создать установочный файл для запуска другого компьютера.Я пытаюсь настроить, но, во-первых, мне нужно знать, есть ли на этом компьютере уже установлен SQL Server.Я искал некоторый код об этом и нашел:

RegistryKey rk = Registry.LocalMachine.OpenSubKey("\\SOFTWARE\\Microsoft\\Microsoft SQL Server");
String[] instances = (String[])rk.GetValue("InstalledInstances");

, но каждый раз экземпляры равны нулю каждый раз.Но когда я пытаюсь посмотреть себя на компьютере, я нахожу вручную.Что не так с этим кодом?

RegistryKey rk = Registry.LocalMachine.OpenSubKey("\\SOFTWARE\\Microsoft\\Microsoft SQL Server");
String[] instances = (String[])rk.GetValue("InstalledInstances");

if (instances.Length > 0)
{
   foreach (String element in instances)
   {
       if (element == "MSSQLSERVER")
       {
          DialogResult res = MessageBox.Show("are u sure to setup this file?", "UYARI", MessageBoxButtons.YesNo);
          if (res == DialogResult.Yes)
          {
             string path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\SQLEXPR.EXE";
             Process p = new Process();
             p.StartInfo.FileName = path;
             p.StartInfo.Arguments = "/qb INSTANCENAME=\"SQLEXPRESS\" INSTALLSQLDIR=\"C:\\Program Files\\Microsoft SQL Server\" INSTALLSQLSHAREDDIR=\"C:\\Program Files\\Microsoft SQL Server\" INSTALLSQLDATADIR=\"C:\\Program Files\\Microsoft SQL Server\" ADDLOCAL=\"All\" SQLAUTOSTART=1 SQLBROWSERAUTOSTART=0 SQLBROWSERACCOUNT=\"NT AUTHORITY\\SYSTEM\" SQLACCOUNT=\"NT AUTHORITY\\SYSTEM\" SECURITYMODE=SQL SAPWD=\"\" SQLCOLLATION=\"SQL_Latin1_General_Cp1_CS_AS\" DISABLENETWORKPROTOCOLS=0 ERRORREPORTING=1 ENABLERANU=0";

             p.StartInfo.CreateNoWindow = true;
             p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
             p.Start();

             p.WaitForExit();
             CreateDB();
          }
          else
          {
             this.Close();
          }
       }
    }
}

Ответы [ 3 ]

2 голосов
/ 21 августа 2011

Вам нужно отбросить начальные значения \:

Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Microsoft SQL Server");

Но при запуске на моей 64-разрядной машине из 32-разрядного исполняемого файла .Net он фактически не сообщает об установленных экземплярах.Это потому, что они только в 64-битном представлении реестра.Чтобы попасть туда из 32-битного процесса в .Net 4, , вы можете использовать этот код :

var localMachine = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
var rk = localMachine.OpenSubKey("SOFTWARE\\Microsoft\\Microsoft SQL Server");
var instances = (String[])rk.GetValue("InstalledInstances");
1 голос
/ 21 августа 2011

Я не уверен, что это единственная проблема, но я заметил, что вы экранировали ", а не \, поэтому вы хотите использовать префикс @ в строке и двойное " вместо \" вот так:

  p.StartInfo.Arguments = @"/qb INSTANCENAME=""SQ... rest of string ... ";

Использовать отформатированные строки @ проще ИМХО, или вы можете вернуться и заменить каждый экземпляр \ в целевом пути на \\


Начиная с MSDN похоже, вам нужно проверить 32 на 64

      try
        {
            // That works fine in Win32 but not in Win64
            return Registry.LocalMachine.OpenSubKey("Software\\XXX\\YYY").GetValue("Path").ToString();
        }
        catch (Exception)
        {
            // That works fine in Win64 but not in Win32
            return Registry.LocalMachine.OpenSubKey("\\Software\\XXX\\YYY").GetValue("Path").ToString();
        }
0 голосов
/ 06 июля 2017

вам нужно проверить, какой ключ взят, потому что вы можете не указывать на правильный ключ, чтобы узнать, какой фактический ключ у вас есть:

string keyValue = registryKey.ToString();

если вы нашли другой ключ, который вы использовали, а именно: SOFTWARE\\Microsoft\\Microsoft SQL Server, то вам следует изменить сборку проектов, поскольку реестры могут быть для 32 или 64, поэтому укажите, какой процессор, не " любой процессор "

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