Как перечислить доступные экземпляры SQL-серверов, использующих SMO в C #? - PullRequest
5 голосов
/ 15 июля 2009

Может кто-нибудь объяснить мне, что я не так делаю в следующем фрагменте кода:

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

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

В sr.Databases выдается исключение, которое не может быть подключено.

Ответы [ 4 ]

9 голосов
/ 15 июля 2009

Взгляните на следующие ссылки, они могут быть полезны:

В качестве альтернативы вы можете изменить свой код на это:

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

Надеюсь, это решит вашу проблему.

6 голосов
/ 15 июля 2009

Есть ли у вас SQL Server с именем экземпляра Test ? Если нет, то это ваша проблема.

Похоже, вы пытаетесь перечислить все локальные экземпляры SQL Server. Если это так, этот код будет работать:

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 голосов
/ 15 июля 2009

На всякий случай, если вопрос озаглавлен неверно, т.е. он хочет найти базы данных в конкретном случае:

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 ответ является наиболее подходящим.

1 голос
/ 11 мая 2011
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                
            }
        }
...