private static void TryKey(RegistryKey k1, LocalInstanceInfo ret, string instanceName) { string rawVersion = null; using (RegistryKey rk = k1.OpenSubKey(@"MSSQLServer\CurrentVersion", false)) if (rk != null) { rawVersion = rk.GetValue("CurrentVersion") as string; } /* * string rawPath = null; * using (RegistryKey rk = k1.OpenSubKey(@"Setup", false)) * if (rk != null) * rawPath = rk.GetValue("SQLPath") as string; */ if (!string.IsNullOrEmpty(rawVersion) /* && rawPath != null && Directory.Exists(rawPath) */) { try { Version ver = new Version(rawVersion); var i = new LocalInstanceInfo.SqlInstance(instanceName); i.FileVer = ver; ret.Instances.Add(i); } catch { } } }
static void BuildDescription(LocalInstanceInfo info, TimeSpan timeout) { if (info.Instances.Count > 0) { List <ManualResetEvent> events = new List <ManualResetEvent>(); foreach (LocalInstanceInfo.SqlInstance instance in info.Instances) { // description LocalInstanceInfo.SqlInstance sqlInstance = instance; ManualResetEvent ev = new ManualResetEvent(false); events.Add(ev); ThreadPool.QueueUserWorkItem( delegate { try { // Console.WriteLine(i2.FullLocalName + ": " + Thread.CurrentThread.ManagedThreadId); // Thread.Sleep(3000); string fullPath; Version productVersion; ServiceControllerStatus status; if (TryService(LocalInstanceInfo.GetServiceKey(sqlInstance.Name), out fullPath, out productVersion, out status)) { sqlInstance.Status = status; sqlInstance.Ver = productVersion; if (sqlInstance.Status == ServiceControllerStatus.Running) { string cs = "Data Source=" + sqlInstance.FullLocalName + ";Integrated Security=SSPI;Pooling=False;"; using (SqlConnection con = new SqlConnection(cs)) using (SqlCommand cmd = new SqlCommand("Select @@version, SERVERPROPERTY('ProductLevel'), SERVERPROPERTY('Edition')", con)) { cmd.CommandTimeout = (int)timeout.TotalSeconds; con.Open(); using (SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.SingleRow)) { if (rdr.Read()) { string description = (string)rdr.GetString(0); string level = (string)rdr.GetString(1); string edition = (string)rdr.GetString(2); description = description.Replace("\t", " ").Replace("\r", " ").Replace("\n", " "); while (description.IndexOf(" ") >= 0) { description = description.Replace(" ", " "); } sqlInstance.IsOK = true; sqlInstance.Description = description; sqlInstance.Level = level; bool isExpress = edition.IndexOf("Desktop Engine") >= 0 || edition.IndexOf("Express Edition") >= 0; sqlInstance.Edition = isExpress ? SqlEdition.Express : SqlEdition.LeastStandard; } } } } } } catch (Exception ex) { Debug.WriteLine( "Failed to connect to " + sqlInstance.FullLocalName + ". See Details Below" + Environment.NewLine + ex + Environment.NewLine); } finally { ev.Set(); } }); } // done: description WaitHandle.WaitAll(events.ToArray()); List <LocalInstanceInfo.SqlInstance> normal = info.Instances.FindAll(delegate(LocalInstanceInfo.SqlInstance i) { return(i.Ver != null); }); info.Instances.Clear(); info.Instances.AddRange(normal); } }