none
SMOで SQLServerインスタンス存在を知る方法 RRS feed

  • 質問

  • 未熟者 と申します。

     

    教えていただきたく 投稿しました。

     

    Microsoft.SqlServer.Management.Smo を 使用して、いろいろしているのですが

     

    SmoのSeverインスタンスを生成するときに

     

    ソース)

    Server server = new Server("サーバー名\インスタンス名");

     

    という風に インスタンスを生成しています。

     

    ですが、サーバ名\インスタンス名を 適当な文字にしても このステップでは エラーがでません。

    そこで、そのステップの前に、SQLServerインスタンスが存在するかを前もって チェックしたいのですが

    その方法なり、メソッドなりが みつかりません。

     

    SMOで SQLServerインスタンスが存在するかのメソッドなり、方法なりをご存知の方は ご教授ください。

     

     

     

     

     

    2008年4月30日 6:35

回答

  • SqlSmoObject.Initialize メソッドがそれに相当すると思います。

     

    Code Snippet

    using System;
    using System.Collections.Generic;
    using System.Text;
    using Microsoft.SqlServer.Management.Smo;

    namespace SMO101
    {
        class Program
        {
            static void Main(string[] args)
            {
                string mySqlName = @"server\instance";
                Server myInstance = new Server(mySqlName);

                try
                {
                    // 初期化する
                    myInstance.Initialize();

     

                    // バージョンを表示してみる
                    Console.WriteLine(myInstance.ConnectionContext.ServerVersion);
                }
                catch (Exception e)
                {
                    // インスタンスがない場合は初期化に失敗する
                    Console.WriteLine(e.ToString());
                }
            }
        }
    }

     

     

     

    2008年4月30日 14:11
  • 接続文字列で指定する方法もあります。

     

    Code Snippet

    using Microsoft.SqlServer.Management.Common;
    using Microsoft.SqlServer.Management.Smo;

     

    ServerConnection connection = new ServerConnection();
    connection.ConnectionString = <接続文字列>;
    connection.Connect();
    Server server = new Server(connection);

     

    接続文字列のサーバー名が間違っていた場合、connection.Connect で例外が発生します。

     

    2008年4月30日 14:33
  •  未熟者 さんからの引用

    ですが、サーバ名\インスタンス名を 適当な文字にしても このステップでは エラーがでません。


    パフォーマンスを考えて、この段階ではまだ実際に接続にいかないからです。

     

     未熟者 さんからの引用

    そこで、そのステップの前に、SQLServerインスタンスが存在するかを前もって チェックしたいのですが

    その方法なり、メソッドなりが みつかりません。


    実際にデータベースにつながるかどうかは、つなぐ時でなければわかりません。つなぐ少し前にデータベースがダウンすることもあり得るからです。 したがって、実際につなぎに行った時につながるかどうかを判断すれば十分でしょう。
    もし、それでも事前にチェックしたいということであれば、Serverオブジェクトが実際に接続しに行くような処理を書けば良いのです。例えばserver.InstanceNameと書けば、データベースに接続しに行き、実際のインスタンス名を取得しようとします。この時、接続できなければ、事前に指定したサーバー名\インスタンス名が誤っているか、そのインスタンスが稼働していないか、もしくはデータベースまで到達できないということになります。

    2008年4月30日 16:02
  • 蛇足になるかもしれませんが、念のために追記しておきます。

     

     trapemiya さんからの引用

    実際にデータベースにつながるかどうかは、つなぐ時でなければわかりません。つなぐ少し前にデータベースがダウンすることもあり得るからです。 したがって、実際につなぎに行った時につながるかどうかを判断すれば十分でしょう。

     

    ちょっと書き方が悪かったかもしれません。「判断すれば十分でしょう。」ではなくて、「判断しなければなりません。」ですね。
    データベースにいつ接続できなくなるかわからないということを常に考えて、コーディングしなければならないということです。そのため、最初にインスタンスが実際に存在するかどうかを確認しても、あまり意味がないと思うのです。

    2008年5月1日 1:16

すべての返信

  • SqlSmoObject.Initialize メソッドがそれに相当すると思います。

     

    Code Snippet

    using System;
    using System.Collections.Generic;
    using System.Text;
    using Microsoft.SqlServer.Management.Smo;

    namespace SMO101
    {
        class Program
        {
            static void Main(string[] args)
            {
                string mySqlName = @"server\instance";
                Server myInstance = new Server(mySqlName);

                try
                {
                    // 初期化する
                    myInstance.Initialize();

     

                    // バージョンを表示してみる
                    Console.WriteLine(myInstance.ConnectionContext.ServerVersion);
                }
                catch (Exception e)
                {
                    // インスタンスがない場合は初期化に失敗する
                    Console.WriteLine(e.ToString());
                }
            }
        }
    }

     

     

     

    2008年4月30日 14:11
  • 接続文字列で指定する方法もあります。

     

    Code Snippet

    using Microsoft.SqlServer.Management.Common;
    using Microsoft.SqlServer.Management.Smo;

     

    ServerConnection connection = new ServerConnection();
    connection.ConnectionString = <接続文字列>;
    connection.Connect();
    Server server = new Server(connection);

     

    接続文字列のサーバー名が間違っていた場合、connection.Connect で例外が発生します。

     

    2008年4月30日 14:33
  •  未熟者 さんからの引用

    ですが、サーバ名\インスタンス名を 適当な文字にしても このステップでは エラーがでません。


    パフォーマンスを考えて、この段階ではまだ実際に接続にいかないからです。

     

     未熟者 さんからの引用

    そこで、そのステップの前に、SQLServerインスタンスが存在するかを前もって チェックしたいのですが

    その方法なり、メソッドなりが みつかりません。


    実際にデータベースにつながるかどうかは、つなぐ時でなければわかりません。つなぐ少し前にデータベースがダウンすることもあり得るからです。 したがって、実際につなぎに行った時につながるかどうかを判断すれば十分でしょう。
    もし、それでも事前にチェックしたいということであれば、Serverオブジェクトが実際に接続しに行くような処理を書けば良いのです。例えばserver.InstanceNameと書けば、データベースに接続しに行き、実際のインスタンス名を取得しようとします。この時、接続できなければ、事前に指定したサーバー名\インスタンス名が誤っているか、そのインスタンスが稼働していないか、もしくはデータベースまで到達できないということになります。

    2008年4月30日 16:02
  • M_Lewis 様、Tesla. 様、trapemiya様

     

    ご回答ありがとうございます。

     

    trycatchで実際にDBに接続し、エラーとして取得する方法ですね。

     

    参考にさせていただきます。

     

    また、何かあればお願いいたします。

     

    ありがとうございました。


     

    2008年5月1日 0:50
  • 蛇足になるかもしれませんが、念のために追記しておきます。

     

     trapemiya さんからの引用

    実際にデータベースにつながるかどうかは、つなぐ時でなければわかりません。つなぐ少し前にデータベースがダウンすることもあり得るからです。 したがって、実際につなぎに行った時につながるかどうかを判断すれば十分でしょう。

     

    ちょっと書き方が悪かったかもしれません。「判断すれば十分でしょう。」ではなくて、「判断しなければなりません。」ですね。
    データベースにいつ接続できなくなるかわからないということを常に考えて、コーディングしなければならないということです。そのため、最初にインスタンスが実際に存在するかどうかを確認しても、あまり意味がないと思うのです。

    2008年5月1日 1:16
  • こんにちは!フォーラムオペレータの栗原麻里です

     

    回答者の皆様、回答ありがとうございます。

     

    未熟者 さん、フォーラムのご利用ありがとうございます。

    参考になる回答のようでしたので、回答者の皆様の回答に回答済みチェックをつけさせていただきました。

     

    回答済みチェックがつくことによって、フォーラムをご利用の皆様も有用な情報を見つけやすく

    なります。回答が参考になりましたら、ぜひ回答済みボタンを押してチェックをつけてくださいね!

     

    未熟者 さんはチェックを解除することもできますのでご確認ください。

     

    それでは、ぜひまたご活用下さい!

     

    2008年5月9日 7:32