2009-07-15 14 views
5

Qualcuno mi può spiegare quello che di sbagliato che sto facendo nel seguente frammento di codice:Come elencare le istanze disponibili di SQL Server usando SMO in C#?

DataTable dt=SmoApplication.EnumAvailableSqlServer(true); 
Server sr = new Server("Test"); 

foreach(DataBase db in sr.DataBases) 
{ 
    Console.WriteLine(db["name"]); 
} 

Dà un'eccezione in sr.Databases che non può essere collegato.

+0

Perché si sta enumerando SQL Server e quindi si sta ancora creando un'istanza di quella "TEST" ?? –

+0

Potrebbe essere che il firewall (o qualcos'altro) blocchi la trasmissione di osql che tenta di trovare le istanze disponibili? –

risposta

8

Date un'occhiata ai seguenti link che possono essere utili:

In alternativa si potrebbe modificare il codice a questo:

DataTable dt = SmoApplication.EnumAvailableSqlServers(false); 
if (dt.Rows.Count > 0) 
{ 
    foreach (DataRow dr in dt.Rows) 
    { 
     Console.WriteLine(dr["Name"]); 
    } 
} 

Spero che questo risolva il tuo problema.

+0

La domanda dice che lui/lei ha bisogno di trovare i nomi di istanza. Ma il codice che ha dato è quello di trovare i database in una particolare istanza di SQLServer. –

6

Si dispone di un server SQL con il nome dell'istanza Test? Se no, questo è il tuo problema.

Sembra che si stia tentando di enumerare tutte le istanze locali di SQL Server. Se è così, questo codice funziona:

DataTable dt = SmoApplication.EnumAvailableSqlServers(true); 

foreach (DataRow dr in dt.Rows) 
{ 
    Console.WriteLine(dr["Name"]); 
    Console.WriteLine(" " + dr["Server"]); 
    Console.WriteLine(" " + dr["Instance"]); 
    Console.WriteLine(" " + dr["Version"]); 
    Console.WriteLine(" " + dr["IsLocal"]); 
} 
2

Nel caso in cui la questione è intitolato sbagliata vale a dire che vuole trovare i database nel caso particolare:

using System; 
using Microsoft.SqlServer.Management.Smo; 
using System.Data; 
using System.Windows.Forms; 
namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main() 
     { 
      Server sr = new Server("MACHINE_NAME\\INSTANCE_NAME"); 

      try 
      { 
       foreach (Database db in sr.Databases) 
       { 
        Console.WriteLine(db.Name); 
       } 
       Console.Read(); 
      } 
      catch (Exception Ex) 
      { 
       MessageBox.Show(Ex.ToString()); 
      } 
     } 
    } 
} 

Else risposta Lucas Aardvark è più appropriato.

+0

Non è necessaria la chiamata a SmoApplication.EnumAvailableSqlServers poiché il valore restituito non viene utilizzato. – adrianbanks

+0

Sì. Grazie per segnalarlo. –

0
using Microsoft.Win32; 

     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) 
      { 
       Console.WriteLine(element); // element is your server name     
      } 
     } 
+1

questo restituirà solo server a 32 bit se compilato come app a 32 bit e lo stesso per 64 bit – Azerothian

Problemi correlati