単純に SQL Server が生きているかPingを打ちたいときがあります。いろいろ方法はあるかと思いますが、ここではSMOを使う方法で考えたいと思います。
と言うことで以下がサンプル的なコード。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;
namespace TestSqlDmo
{
public class SQLSMO_Sample
{
///
/// 引数で渡されたサーバーインスタンスに接続し、バージョン情報を返します。
///
/// 対象となるSQLサーバーのインスタンス名(Exp."HostName\SQLEXPRESS")
/// 対象のSQL Serverのメジャーバージョン
public string ConnectionServerTest(string instanceName) {
try {
ServerConnection con = new ServerConnection(instanceName);
con.ConnectTimeout = 2;
con.LoginSecure = true;
Server srv = new Server(con);
//タイムアウトとか細かく設定しないなら以下のように接続しても良いです。
//Server srv = new Server(instanceName);
return srv.Information.Version.Major.ToString();
//もしくは
//return srv.PingSqlServerVersion(srv.Name).ToString();
}
catch (Microsoft.SqlServer.Management.Common.ConnectionFailureException e) {
Console.WriteLine(e.Message);
throw e;
}
}
///
/// 引数で渡されたサーバーインスタンスに接続し、それが持つデータベースの一覧を返します。
///
/// 対象となるSQLサーバーのインスタンス名
/// データベース名のリスト
public List GetDatabaseList(string instanceName) {
try {
ServerConnection con = new ServerConnection(instanceName);
con.ConnectTimeout = 2;
con.LoginSecure = true;
Server srv = new Server(con);
List DbNames = new List();
foreach (Database d in srv.Databases) {
DbNames.Add(d.Name);
}
return DbNames;
}
catch (Microsoft.SqlServer.Management.Common.ConnectionFailureException e) {
Console.WriteLine(e.Message);
throw e;
}
}
}
}
まぁこんなものかなと。コネクションのタイムアウトは環境に合わせて適宜見直した方がよいと思います。
基本的にExceptionが帰ってこなかったら生きている判断と言うことで。
二つ目はアプリケーションが必要とするデータベースがあるかないか確認したいというのも良くあることなので、とりあえずサンプルを加えてみました。
SMO便利だと思うのですが、使っている人も少ないらしく、これもあんまり情報がありませんね。
SQL Server 管理オブジェクト (SMO)
http://msdn.microsoft.com/ja-jp/library/ms162169.aspx
また、SMO経由でWMIを使用し、実際にサービスが実行中であるかを確認することもできます。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo.Wmi; //←ここが追加
namespace TestSqlDmo
{
public class SQLSMO_Sample
{
///
/// 特定のサーバー上で動作するSQL Serverのサービスが実行中であるかを確認する。
/// また、このときの認証はWindows認証を利用する。
///
///
/// WMIのエラーが返ります。
///
/// サーバー名
/// サービス名
/// そのサービスが実行中であればtrueが返ります。
public bool IsServiceRunnning(string serverName, string serviceName) {
ManagedComputer comp = new ManagedComputer(serverName);
if (ServiceState.Running == comp.Services[serviceName].ServiceState) {
return true;
}
else {
return false;
}
}
}
}
(15:38追記)
追加情報:
SMOに必要なコンポーネントは以下に保存されています。
C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\
SQL Server 2008(R2)がインストールされているVisual Studio 2008/2010では参照の追加からも追加できるはずです。
参照しなければならないコンポーネントは以下になります。
- Microsoft.SqlServer.Smo.dll
- Microsoft.SqlServer.ConnectionInfo.dll
- Microsoft.SqlServer.SqlEnum.dll
- Microsoft.SqlServer.SmoEnum.dll
参考:http://msdn.microsoft.com/ja-jp/library/ms162129.aspx
また、WMIプロバイダを使用するケースでは以下についても参照します。
- Microsoft.SqlServer.SqlWmiManagement.dll
- Microsoft.SqlServer.WmiEnum.dll
その他参考:
SMOプログラムの作成
http://msdn.microsoft.com/ja-jp/library/ms162202.aspx
プログラミング特有のタスク
http://msdn.microsoft.com/ja-jp/library/ms162175.aspx
<
p>WMIプロバイダを使用したサービスの管理とネットワーク設定
http://msdn.microsoft.com/ja-jp/library/ms162567.aspx
コメント
C#, SQL Server : SMOを使ったSQL Serverへの生死確認
素敵なエントリーの登録ありがとうございます – .NET Clipsからのトラックバック