2009-07-08 13 views
1

Kann mir jemand sagen, wie man remote Sqlserver Instanzen mit C# und SMO oder einem API?Wie bekomme ich die Liste der SqlInstances einer bestimmten Maschine?

Ich habe einen Remote-Server-Namen "RemoteMC", die zwei Instanzen von SQL Server hat: "RemoteMc" und "RemoteMC \ sqlexpress"

Ich versuche, die Instanzen in Code wie folgt zu erhalten:

Server srv=new Server("RemoteMC"); 
DataTable dt=SmoApplication.EnumAvailableSqlServer(true); 

Aber es gibt "Host \ sqlexpress"

Ich weiß nicht, was schief gelaufen ist. Wie kann ich das Ergebnis zurück wie:

RemoteMC
RemoteMC \ sqlexpress;

?

Antwort

5

die SmoApplication.EnumAvailableSqlServers Methode ist das, was Sie suchen. Es gibt 3 Überlastungen, und einer von denen, nimmt einen string Parameter für die Servernamen.

Es gibt ein DataTable der Zeilen Felder wie Version, name, IsLocal usw.

Sie müssen einen Verweis auf die SMO-Bibliotheken hinzufügen, und Sie werden wahrscheinlich "using Microsoft.SqlServer.Management.Smo;" oben in Ihrer C# -Datei haben wollen.

Eine Einführung in SQL SMO finden Sie unter http://www.sqldbatips.com/showarticle.asp?ID=34.

EDIT: Einige Code dieses spezielle Problem zu adressieren (Ich habe dies nicht kompiliert oder ausgeführt werden):

EDIT: .Rows hinzufügen, so foreach, dass sie zusammenstellen können.

DataTable dataTable = SmoApplication.EnumAvailableSqlServers(false); 

foreach (DataRow dataRow in dataTable.Rows) 
{ 
    if ((dataRow["Server"] as string) == "MyServerName") 
     Console.WriteLine(dataRow["Instance"] as string); 
} 
+0

mit, dass ich lokale SQL-Entdeckung sei immer only.How i für die Fern sqlDiscovery.means gehen kann ich die Anwendung ausgeführt werden kann, dann sollte es für bestimmte Maschine gehen und rufe die Informationen zu meinem lokalen machine.If i EnumAvailableSqlServers verwenden (true) es gibt nur lokale, wenn ich string übergeben, die benannte Instanzen von remote kommen nur, wenn eine andere 2 mehr existiert o remote ich werde sie nicht bekommen. – Cute

+0

Hmmm ... du hast Recht. Ich habe 2 Instanzen auf meiner Maschine, eine SQL 2000-Instanz namens "MYMACHINE" und eine SQL 2005-Instanz namens "MYMACHINE \ MYSQL2005". Wenn ich "MYMACHINE" passiere, bekomme ich nur diese eine Instanz. Ich denke, das Problem ist, dass Sie entweder einen Servernamen ODER einen Instanznamen übergeben können - und in diesem Fall ist der Servername zufällig auch ein Instanzname, und EnumAvailableServers tut, was er normalerweise für einen Instanznamen tut, dh um zurückzukehren Info nur über diese Instanz. Yuk. –

+0

Als Alternative können Sie die Überladung verwenden, die einen booleschen Parameter verwendet, und false übergeben (dh NICHT nur lokale Instanzen). Dadurch erhalten Sie eine große Tabelle mit allen lokal zugänglichen Instanzen, und Sie können die Spalte Server filtern.Es ist nicht ideal, da es vermutlich länger dauert, die Liste zu erstellen. Aber es wird funktionieren. –

0

Eine Möglichkeit ist es den Registrierungseintrag "" Software \ Microsoft \ Microsoft SQL Server \ Instanz Namen \ SQL \“unter Local Machine zu tun zu lesen. Sind Sie Registrierung in der Ihrer Lösung zu lesen erlaubt?

1

Verwenden Sie den eingebauten Weg.

System.Data.Sql.SqlDataSourceEnumerator