2009-07-16 10 views
1

Ich schrieb dies die SQL Server-Instanzen auf dem lokalen Computer für die Suche:Wie Sie eine Verbindung zu Sqlserver2008 mithilfe von SMO herstellen, muss jede Problemumgehung durchgeführt werden?

using System; 
using System.Data; 
using Microsoft.SqlServer.Management.Smo; 

namespace Application3 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      string srvname = string.Empty; string srvnames = null; 

      DataTable dt = SmoApplication.EnumAvailableSqlServers(true); 

      Console.WriteLine("------------->" + dt.Rows.Count); 

      foreach (DataRow dr in dt.Rows) 
      { 
       try{ 

       Console.WriteLine("-->Instance " + dr["name"]); 

       Server srv = new Server((string)dr["name"]); 

        foreach (Database db in srv.Databases) 

         Console.WriteLine(db.Name); 
       }catch(Exception e) 
      { 
       Console.writeLine(e.toString()); 
      } 
     } 
    } 
} 

I 3 Instanzen in meinem lokalen Rechner

  1. rk2k3-vm-sr (SQL2008-Instanz)
  2. rk2k3 habe -VM-sr \ sql2k8express (sql2k8 Instanz zu)
  3. rk2k3-vm-sr \ sqlexpress (sql2k5 Instanz)

Aber es zeigt nur 2 und 3. 1 zeigt nicht. Und wenn ich verbinde mit Server-Objekt schlägt es für sql2k8express fehl. Hier

ist der Ausgang ....


-> Instanz RK2K3-VM-SR \ SQLEXPRESS
Master
Modell
msdb
tempdb


-> Instanz RK2K3-VM-SR \ SQL2K8EXPRESS

Microsoft.SqlServer.Management.Common.ConnectionFailureException: Fehler ect Server RK2K3-VM-SR \ SQL2K8EXPRESS Conn. ---> Microsoft.SqlServer.Management.Com mon.ConnectionFailureException: Diese SQL Server-Version (10.0) wird nicht unterstützt. bei Microsoft.SqlServer.Management.Common.ConnectionManager.CheckServerVersion (Serverversion Version) bei Microsoft.SqlServer.Management.Common.ConnectionManager.InternalConnect (Wi ndowsIdentity impersonatedIdentity) bei Microsoft.SqlServer.Management.Common.ConnectionManager.Connect() --- Ende der inneren Ausnahme Stack-Trace --- bei Microsoft.SqlServer.Management.Common.ConnectionManager.Connect() bei Microsoft.SqlServer.Management.Common.ConnectionManager.PoolConnect() bei Microsoft.SqlServer .Management.Common.ConnectionManager.get_ServerVersion ( ) bei Microsoft.SqlServer.Management.Smo.ExecutionManager.get_ServerVersion() bei Microsoft.SqlServer.Management.Smo.SqlSmoObject.GetDbComparer (Boolean INSE rver) bei Microsoft.SqlServer.Management.Smo.SqlSmoObject.InitializeStringComparer() bei Microsoft.SqlServer.Management.Smo.AbstractCollectionBase.get_StringCompar er () bei Microsoft.SqlServer.Management.Smo.SimpleObjectCollectionBase.InitInnerCol lection() bei Microsoft.SqlServer.Management.Smo.SmoCollectionBase.get_InternalStorage() bei Microsoft.SqlServer.Management.Smo.SmoCollectionBase.InitializeChildCollec tion (Boolean aktualisieren) bei Microsoft.SqlServer.Management.Smo.SmoCollectionBase.GetEnumerator() bei ConsoleApplication3.Program.Main (Stri ng [] args) in C: \ Dokumente und Settin gs \ Administrator.APP \ Desktop \ ConsoleApplication3 \ Program.cs: line 25

Wie kann ich das beheben? Meine System-Firewall ist deaktiviert und alle SQL-Dienste werden ausgeführt.

Antwort

3

Wurde dieser Code zuvor für SQL 2005 geschrieben? Wenn ja müssen Sie

  1. Installieren Sie SQL 2005 rückwärts Compatibilty-Pack für SQL 2008 + Management auf der Maschine Objekte. (http://www.microsoft.com/downloads/details.aspx?FamilyID=b33d2c78-1059-4ce2-b80d-2343c099bcb4&displaylang=en)

  2. Referenzen entfernen dlls von SLQ 2005 & re Bezug auf SK Dlls von SQL SDK 2008. (http://msdn.microsoft.com/en-us/library/ms162129.aspx)

  3. neu erstellen.

Siehe auch: Application cannot find Microsoft.SQLServer.SMO on SQL 2008 machine

+0

Nein, es ausschließlich für SQL2008 – Cute

+0

Zuvor DMO geschrieben wird verwendet sql2k8 i SMo verwendet zu Entdecken, aber es zeigt die oben genannten Probleme. – Cute

+0

versuchen, DataTable dt = SmoApplication.EnumAvailableSqlServers (True) zweimal auszuführen. Grund: Der Computer, auf dem der SQL Server-Instanz ausgeführt wird, empfängt möglicherweise nicht rechtzeitig Antworten auf die EnumAvailableSqlServers-Methode. Die zurückgegebene Liste zeigt möglicherweise nicht alle verfügbaren Instanzen von SQL Server im Netzwerk an. Wenn Sie die EnumAvailableSqlServers-Methode bei nachfolgenden Versuchen aufrufen, werden möglicherweise mehr Server im Netzwerk sichtbar. Diese Methode kann die lokale Instanz nicht auflisten, wenn eine Firewall auf dem Server ausgeführt wird. Die Firewall blockiert jeden Broadcast-Verkehr ausgegeben –