1

SMO(VS 2010、SQL Server 2008)を使用してSQL Serverに接続し、サーバープロトコル構成を表示しようとしています。サービスとClientProtocols、およびMSSQLSERVERサービスが実行されているアカウントを接続して一覧表示できます。ただし、ServerInstancesコレクションは空です。ターゲットサーバー上の唯一のインスタンスはデフォルト(MSSQLSERVER)ですが、それをコレクションに含めるべきではありませんか?ServerProtocolsコレクションを検査できるように、インスタンスを取得するにはどうすればよいですか?これが私が使用しているコードです:

    class Program
{
    static void Main(string[] args)
    {
        //machine hosting installed sql server instance
        ManagedComputer host = new ManagedComputer("fully-qualified.host.name");


        if (host.ServerInstances.Count != 0)
        {
            //why is this 0? Is it because only the DEFAULT instance exists?
            Console.WriteLine("/////////////// INSTANCES ////////////////");
            foreach (ServerInstance inst in host.ServerInstances)
            {
                Console.WriteLine(inst.Name);
            }
        }

        Console.WriteLine("/////////////// SERVICES ////////////////");
        // enumerate sql services (looking for MSSSQLSERVER)
        foreach (Service svc in host.Services)
        {
            Console.WriteLine(svc.Name);
        }

        Console.WriteLine("/////////////// DETAILS ////////////////");

        // get name of MSSQLSERVER instance from user (pick from list above)
        Service mssqlserver = host.Services["MSSQLSERVER"];

        // print service account: .\{account} == "local account", "LocalSystem", "NetworkService", {domain}\{account} == "domain account"
        Console.WriteLine("Service Account: {0}", mssqlserver.ServiceAccount);

        // get client protocols
        foreach (ClientProtocol cp in host.ClientProtocols)
        {
            Console.WriteLine("{0} {1} ({2})", cp.Order, cp.DisplayName, cp.IsEnabled ? "Enabled" : "Disabled");
        }

    }
}

私も試しました:

            Urn u = new Urn("ManagedComputer[@Name='fully-qualified.host.name']/ServerInstance[@Name='MSSQLSERVER']/ServerProtocol[@Name='Tcp']");
        ServerProtocol tcp = host.GetSmoObject(u) as ServerProtocol;
        if (tcp != null)
        {
            Console.WriteLine("{0}", tcp.DisplayName);
        }

しかし、「子式はサポートされていません」というエラーメッセージが表示されます。何が問題なのですか?

4

2 に答える 2

6

ServerInstancesリストに結果を表示するには、以下を明示的に設定する必要があります。

host.ConnectionSettings.ProviderArchitecture = ProviderArchitecture.Use64bit;

また

host.ConnectionSettings.ProviderArchitecture = ProviderArchitecture.Use32bit;

于 2013-03-09T16:13:39.877 に答える
0

そのため、これに対する答えは見つかりませんでしたが、回避策を考え出しました。

            ManagedComputer host = new ManagedComputer(hostName);

        Server server = new Server();
        Console.WriteLine("TcpEnabled: {0}", server.TcpEnabled);

これにより、必要なものが得られます。ServerProtocolsを列挙できるようにしたいと思いますが、これにより、最小限の検証が可能になります。

于 2010-05-18T22:31:05.350 に答える