トップ回答者
SMOで SQLServerインスタンス存在を知る方法

質問
-
未熟者 と申します。
教えていただきたく 投稿しました。
Microsoft.SqlServer.Management.Smo を 使用して、いろいろしているのですが
SmoのSeverインスタンスを生成するときに
ソース)
Server server = new Server("サーバー名\インスタンス名");
という風に インスタンスを生成しています。
ですが、サーバ名\インスタンス名を 適当な文字にしても このステップでは エラーがでません。
そこで、そのステップの前に、SQLServerインスタンスが存在するかを前もって チェックしたいのですが
その方法なり、メソッドなりが みつかりません。
SMOで SQLServerインスタンスが存在するかのメソッドなり、方法なりをご存知の方は ご教授ください。
回答
-
SqlSmoObject.Initialize メソッドがそれに相当すると思います。
Code Snippetusing 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());
}
}
}
} -
接続文字列で指定する方法もあります。
Code Snippetusing Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;ServerConnection connection = new ServerConnection();
connection.ConnectionString = <接続文字列>;
connection.Connect();
Server server = new Server(connection);接続文字列のサーバー名が間違っていた場合、connection.Connect で例外が発生します。
-
未熟者 さんからの引用
ですが、サーバ名\インスタンス名を 適当な文字にしても このステップでは エラーがでません。
パフォーマンスを考えて、この段階ではまだ実際に接続にいかないからです。未熟者 さんからの引用
そこで、そのステップの前に、SQLServerインスタンスが存在するかを前もって チェックしたいのですがその方法なり、メソッドなりが みつかりません。
実際にデータベースにつながるかどうかは、つなぐ時でなければわかりません。つなぐ少し前にデータベースがダウンすることもあり得るからです。 したがって、実際につなぎに行った時につながるかどうかを判断すれば十分でしょう。
もし、それでも事前にチェックしたいということであれば、Serverオブジェクトが実際に接続しに行くような処理を書けば良いのです。例えばserver.InstanceNameと書けば、データベースに接続しに行き、実際のインスタンス名を取得しようとします。この時、接続できなければ、事前に指定したサーバー名\インスタンス名が誤っているか、そのインスタンスが稼働していないか、もしくはデータベースまで到達できないということになります。 -
蛇足になるかもしれませんが、念のために追記しておきます。
trapemiya さんからの引用
実際にデータベースにつながるかどうかは、つなぐ時でなければわかりません。つなぐ少し前にデータベースがダウンすることもあり得るからです。 したがって、実際につなぎに行った時につながるかどうかを判断すれば十分でしょう。ちょっと書き方が悪かったかもしれません。「判断すれば十分でしょう。」ではなくて、「判断しなければなりません。」ですね。
データベースにいつ接続できなくなるかわからないということを常に考えて、コーディングしなければならないということです。そのため、最初にインスタンスが実際に存在するかどうかを確認しても、あまり意味がないと思うのです。
すべての返信
-
SqlSmoObject.Initialize メソッドがそれに相当すると思います。
Code Snippetusing 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());
}
}
}
} -
接続文字列で指定する方法もあります。
Code Snippetusing Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;ServerConnection connection = new ServerConnection();
connection.ConnectionString = <接続文字列>;
connection.Connect();
Server server = new Server(connection);接続文字列のサーバー名が間違っていた場合、connection.Connect で例外が発生します。
-
未熟者 さんからの引用
ですが、サーバ名\インスタンス名を 適当な文字にしても このステップでは エラーがでません。
パフォーマンスを考えて、この段階ではまだ実際に接続にいかないからです。未熟者 さんからの引用
そこで、そのステップの前に、SQLServerインスタンスが存在するかを前もって チェックしたいのですがその方法なり、メソッドなりが みつかりません。
実際にデータベースにつながるかどうかは、つなぐ時でなければわかりません。つなぐ少し前にデータベースがダウンすることもあり得るからです。 したがって、実際につなぎに行った時につながるかどうかを判断すれば十分でしょう。
もし、それでも事前にチェックしたいということであれば、Serverオブジェクトが実際に接続しに行くような処理を書けば良いのです。例えばserver.InstanceNameと書けば、データベースに接続しに行き、実際のインスタンス名を取得しようとします。この時、接続できなければ、事前に指定したサーバー名\インスタンス名が誤っているか、そのインスタンスが稼働していないか、もしくはデータベースまで到達できないということになります。 -
蛇足になるかもしれませんが、念のために追記しておきます。
trapemiya さんからの引用
実際にデータベースにつながるかどうかは、つなぐ時でなければわかりません。つなぐ少し前にデータベースがダウンすることもあり得るからです。 したがって、実際につなぎに行った時につながるかどうかを判断すれば十分でしょう。ちょっと書き方が悪かったかもしれません。「判断すれば十分でしょう。」ではなくて、「判断しなければなりません。」ですね。
データベースにいつ接続できなくなるかわからないということを常に考えて、コーディングしなければならないということです。そのため、最初にインスタンスが実際に存在するかどうかを確認しても、あまり意味がないと思うのです。