2009-07-16 3 views
1

Je l'ai écrit pour trouver les instances de serveur SQL sur la machine locale:Comment se connecter à Sqlserver2008 en utilisant SMO une solution de contournement doit être fait?

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()); 
      } 
     } 
    } 
} 

J'ai 3 cas dans ma machine locale

  1. rk2k3-vm-sr (par exemple SQL2008)
  2. rk2k3 -vm-sr \ sql2k8express (sql2k8 instacne)
  3. rk2k3-vm-sr \ sqlexpress (exemple sql2k5)

Mais il montre seulement 2 et 3. 1 ne montre pas. Et quand je me connecte en utilisant l'objet serveur, il échoue pour sql2k8express.

Voici la sortie ....


-> instance RK2K3-VM-SR \ SQLEXPRESS
maître
modèle
msdb
tempdb


-> instance RK2K3-VM-SR \ SQL2K8EXPRESS

Microsoft.SqlServer.Management.Common.ConnectionFailureException: Impossible de conn ect au serveur RK2K3-VM-SR \ SQL2K8EXPRESS. ---> Microsoft.SqlServer.Management.Com mon.ConnectionFailureException: Cette version de SQL Server (10.0) n'est pas prise en charge. à Microsoft.SqlServer.Management.Common.ConnectionManager.CheckServerVersion (version ServerVersion) à Microsoft.SqlServer.Management.Common.ConnectionManager.InternalConnect (Wi ndowsIdentity impersonatedIdentity) à Microsoft.SqlServer.Management.Common.ConnectionManager.Connect() --- Fin de trace de pile d'exception interne --- à Microsoft.SqlServer.Management.Common.ConnectionManager.Connect() à Microsoft.SqlServer.Management.Common.ConnectionManager.PoolConnect() à Microsoft.SqlServer .Management.Common.ConnectionManager.get_ServerVersion ( ) à Microsoft.SqlServer.Management.Smo.ExecutionManager.get_ServerVersion() à Microsoft.SqlServer.Management.Smo.SqlSmoObject.GetDbComparer (Boolean inse RVer) à Microsoft.SqlServer.Management.Smo.SqlSmoObject.InitializeStringComparer() à Microsoft.SqlServer.Management.Smo.AbstractCollectionBase.get_StringCompar er () à Microsoft.SqlServer.Management.Smo.SimpleObjectCollectionBase.InitInnerCol lection() à Microsoft.SqlServer.Management.Smo.SmoCollectionBase.get_InternalStorage() à Microsoft.SqlServer.Management.Smo.SmoCollectionBase.InitializeChildCollec tion (Boolean actualiser) à Microsoft.SqlServer.Management.Smo.SmoCollectionBase.GetEnumerator() à ConsoleApplication3.Program.Main (Stri ng [] args) dans C: \ Documents and Settin gs \ Administrator.APP \ Desktop \ ConsoleApplication3 \ Program.cs: ligne 25

Comment puis-je résoudre ce problème? Mon pare-feu système est désactivé et tous les services SQL sont en cours d'exécution.

Répondre

3

Est-ce que ce code a déjà été écrit pour SQL 2005? Si oui, vous devez

  1. Installer SQL 2005 Backwards Pack pour SQL Compatibilty 2008 + Gestion des objets sur la machine. (http://www.microsoft.com/downloads/details.aspx?FamilyID=b33d2c78-1059-4ce2-b80d-2343c099bcb4&displaylang=en)

  2. supprimer les références aux SDK DLLs de SLQ 2005 & re référence à SK Dlls de SQL 2008. (http://msdn.microsoft.com/en-us/library/ms162129.aspx)

  3. Reconstruire.

Se référer également à: Application cannot find Microsoft.SQLServer.SMO on SQL 2008 machine

+0

Non, c'est exclusivement écrit pour SQL2008 – Cute

+0

Auparavant DMO utilisé pour découvrir sql2k8 i utilisé SMo mais il montre les problèmes ci-dessus. – Cute

+0

essayez d'exécuter DataTable dt = SmoApplication.EnumAvailableSqlServers (true) deux fois. Raison: L'ordinateur exécutant l'instance SQL Server peut ne pas recevoir les réponses à la méthode EnumAvailableSqlServers en temps opportun. La liste renvoyée peut ne pas afficher toutes les instances disponibles de SQL Server sur le réseau. Lorsque vous appelez la méthode EnumAvailableSqlServers dans les tentatives suivantes, plusieurs serveurs peuvent devenir visibles sur le réseau. Cette méthode ne parvient pas à répertorier l'instance locale si un pare-feu fonctionne sur le serveur. Le pare-feu bloque tout trafic de diffusion émis –

Questions connexes