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
- rk2k3-vm-sr (par exemple SQL2008)
- rk2k3 -vm-sr \ sql2k8express (sql2k8 instacne)
- 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.
Non, c'est exclusivement écrit pour SQL2008 – Cute
Auparavant DMO utilisé pour découvrir sql2k8 i utilisé SMo mais il montre les problèmes ci-dessus. – Cute
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 –