2009-07-15 11 views
5

Kann jemand mir erklären, was ich falsch ich in dem folgenden Stück Code tue:Wie listen Sie verfügbare Instanzen von SQL Servern auf, die SMO in C# verwenden?

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

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

eine Ausnahme in sr.Databases gibt, die sich nicht angeschlossen.

+0

Warum Sie die SQL-Server aufzählen, und dann nur noch die eine "TEST" instanziieren ?? –

+0

Könnte es sein, dass Ihre Firewall (oder etwas anderes) osqls Broadcast blockiert, die versucht, verfügbare Instanzen zu finden? –

Antwort

8

Werfen Sie einen Blick auf die folgenden Links können sie hilfreich sein:

Alternativ Sie Ihren Code dies ändern könnte:

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

Hoffe das löst Ihr Problem.

+0

Die Frage besagt, dass er/sie die Instanznamen finden muss. Aber der Code, den er gab, dient dazu, die Datenbanken in einer bestimmten SQL Server-Instanz zu finden. –

6

Haben Sie einen SQL Server mit dem Instanznamen Test? Wenn nicht, ist das dein Problem.

Es sieht so aus, als ob Sie versuchen, alle lokalen SQL Server-Instanzen aufzulisten. Wenn ja, wird dieser Code funktionieren:

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

Nur für den Fall ist die Frage falsch betitelt das heißt, er will die Datenbanken im speziellen Fall finden:

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 Lucas Aardvark Antwort am besten geeignet ist.

+0

Sie benötigen den Aufruf von SmoApplication.EnumAvailableSqlServers nicht, da der Rückgabewert nicht verwendet wird. – adrianbanks

+0

Yup. Danke, dass du es aufgezeigt hast. –

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

Dies gibt nur 32-Bit-Server zurück, wenn sie als 32-Bit-App und dasselbe für 64-Bit kompiliert werden – Azerothian