3

重複の可能性:
SqlDataSourceEnumerator.Instance.GetDataSources() がローカル SQL Server 2008 インスタンスを見つけられない

以下のコードを使用して、ローカル マシンのすべてのインスタンス名とサーバー名を取得していますが、返されるインスタンスは 1 つだけのようです。ローカルマシンでインスタンス名とサーバー名のすべてのリストを取得する方法は?

string myServer = Environment.MachineName;

DataTable servers = SqlDataSourceEnumerator.Instance.GetDataSources();

for (int i = 0; i < servers.Rows.Count; i++)
{
        if (myServer == servers.Rows[i]["ServerName"].ToString()) 
        {
            if ((servers.Rows[i]["InstanceName"] as string) != null)
            {
                CmbServerName.Visibility = Visibility.Visible;
                CmbServerName.Items.Add(servers.Rows[i]["ServerName"] + "\\" + servers.Rows[i]["InstanceName"]);

            }
            else
            {
                CmbServerName.Visibility = Visibility.Visible;
                CmbServerName.Items.Add(servers.Rows[i]["ServerName"]);

            }
        }
}

前もって感謝します!

4

4 に答える 4

5

SQL Serverのインストール済みインスタンス名を取得する別の方法は、マシンレジストリを読み取ることです。ローカルマシンからsqlのすべてのインスタンスをフェッチします。

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)
                {
                    if (element == "MSSQLSERVER")
                        Console.WriteLine(System.Environment.MachineName);
                    else
                        Console.WriteLine(System.Environment.MachineName + @"\" + element);

                }
                Console.ReadLine();
            }
于 2012-11-06T10:52:57.707 に答える
1

別の解決策:

Microsoft.SqlServer.Management.Smo.SmoApplication.EnumAvailableSqlServers

于 2012-11-06T11:14:38.287 に答える
1

これはそうではないかもしれませんが、試してみる価値があります。お使いのマシンでSQL Server Browser サービスが実行されていますか?

于 2012-11-06T10:56:14.237 に答える
1

GetDataSource()マシンから見えるすべてのインスタンスを取得します。ServerNameは、インスタンスがホストされているマシンの名前であり、マシンには 1 つのインスタンスしかないように見えます。

太字の部分はどういう意味ですか: 「ローカル マシンでインスタンス名とサーバー名のすべてのリストを取得する方法」 ? マシンから見えるすべてのサーバーを表示したい場合は、if ステートメントを削除する必要があります

if (myServer == servers.Rows[i]["ServerName"].ToString()) 

ローカル マシン名を持つサーバーは 1 つしかないため、他のサーバー名を取得することはできません。

ドキュメンテーションレポートに注意してください

ネットワーク上のデータ ソースを検索するために SqlDataSourceEnumerator によって使用されるメカニズムの性質上、このメソッドは常に使用可能なサーバーの完全なリストを返すとは限らず、リストはすべての呼び出しで同じではない可能性があります。この関数を使用してユーザーがリストからサーバーを選択できるようにする場合は、サーバーの列挙が使用可能なすべてのサーバーを返さない場合に備えて、リストにない名前を入力するオプションも必ず指定してください。 . さらに、このメソッドの実行にはかなりの時間がかかる場合があるため、パフォーマンスが重要な場合は注意して呼び出してください。

したがって、この問題が原因である可能性があります。

于 2012-11-06T10:56:19.077 に答える