2009-07-15 10 views
5

誰もが、私は次のコードでやっている私が間違っているものを私に説明できます:C#でSMOを使用してSQL Serverの使用可能なインスタンスをリストする方法?

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

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

それは接続することはできませんsr.Databasesで例外を提供します。

+0

なぜSQL Serverを列挙し、それでも1つの "TEST"をインスタンス化するのですか? –

+0

あなたのファイアウォール(または何か他のもの)が、利用可能なインスタンスを見つけようとするosqlのブロードキャストをブロックしている可能性がありますか? –

答えて

8

は、彼らが役に立つかもしれ次のリンクを見てみましょう:

はまた、あなたがこのようにコードを変更することができます:

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

これがあなたの問題を解決することを願っています。

+0

質問は、彼/彼女はインスタンス名を見つける必要があると言います。しかし、彼が与えたコードは、特定のSQLServerインスタンスのデータベースを見つけるためのものです。 –

6

インスタンス名がのSQL Serverがありますか。?もしそうでなければ、それはあなたの問題です。

すべてのローカルSQL Serverインスタンスを列挙しようとしているようです。もしそうなら、このコードは動作します:

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

エルスルーカスアードバーク答えが最も適切である:質問は、彼が特定のインスタンス内のデータベースを見つけたい、すなわち、間違ったタイトルは念のために

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

+0

戻り値が使用されていないため、SmoApplication.EnumAvailableSqlServersを呼び出す必要はありません。 – adrianbanks

+0

うん。それを指摘してくれてありがとう。 –

0
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     
      } 
     } 
+1

これは、32ビットアプリケーションとしてコンパイルされた場合は32ビットサーバのみを返し、64ビット – Azerothian

関連する問題