私がこれをやっている理由はわかりませんが、あなたはめったに答えを受け入れることはできないと考えていますが、ここには入ります。あなたの質問は、多くの問題を引き起こします。だから、私に接続& ....私と
を
を負担接続は、たくさんのことを意味することができます。はるかに低いレイヤーで@Paddyが指摘するように、PINGはあなたが到達可能なネットワークにOSが接続されているかどうかを教えてくれます。しかし、コンピュータを接続して、SQLを停止したり、オフラインにしたり、誤動作させたりすることができます。 SQLはオンラインでも構いませんが、ファイアウォールは要求元のコンピュータからのアクセスをブロックします。要求しているコンピュータにはアクセス許可がない可能性があります。リストは続く。
SQL Serverへの接続を開く機能がは、接続をテストするための方法であって、ここで
私のポイントは、ということです。
私の場合は、非同期スレッドに小さなADOテストを入れます。テストでは、短いタイムアウトを使用して接続を開こうとします。
症状を解決しますか?
SQL Serverは、高可用性製品として実際に設計され、一般的には考えられています。意味は、あなたのSQLアクセスが(それが一般的なエラーハンドラを超えて)それをテストしたいと思っているので、私はavilabilityの問題を解決することをお勧めします。多くの不運と組み合わされた最も基本的なインストールでさえ、95%以上のアップタイムを許容するはずです。私はこの時点で、あなたを思いとどまらせていない場合は
をテストするために、SQL SMOを使用し
、代替があります。 SQL SMO(SQL DMOの代わり)は、SQLサーバー管理へのプログラムによるアクセスを可能にする一連のオブジェクトです。
あなたが見て、このgetting started記事を使用することができますどのようにセットアッププロジェクトをします。 SQL Serverに接続するには、WINDOWS権限(SQL認証とは対照的)が必要です。
は今のコードに:
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 SQL_SMO_Test {
class Program {
public const string SQL_SERVICE_BASENAME = "MSSQL";
public static bool SQLServiceIsRunning (string SQLServerName) {
string[] nameComponents;
string ComputerName;
string InstanceName;
string ServiceName;
ManagedComputer mc;
ServiceCollection serviceList;
//split up SQL Name
nameComponents = SQLServerName.Split('\\');
ComputerName = nameComponents[0];
InstanceName = nameComponents.Length > 1 ? nameComponents[1] : "";
ServiceName = SQL_SERVICE_BASENAME +
((InstanceName.Length>0) ? "$" + InstanceName : "");
//get WMI Computer object
mc = new ManagedComputer(ComputerName);
serviceList = mc.Services;
//find any SQL Services & See if it's our instance
foreach (Service s in serviceList) {
if (s.Type.Equals(ManagedServiceType.SqlServer)) {
Console.WriteLine("Service Found --" + s.Name);
if ((!ServiceName.Contains('$')) || s.Name == ServiceName) {
Console.WriteLine("..Correct Instance found" + s.Name);
if (s.ServiceState.Equals(ServiceState.Running)){
Console.WriteLine("....Service is Running");
return true;
}
}
}
} //end foreach()
Console.WriteLine("service not found, or stopped");
return false; //service not found, or stopped
} //end SQLServiceIsRunning
/* format: servername\instanceIfAny */
public static bool SQLIsRunning(string SQLServerName) {
Server srv;
Console.WriteLine("SERVICE RUNNING (" + SQLServerName + ") ?");
Console.WriteLine("------------------------------");
if (! SQLServiceIsRunning(SQLServerName)) {
return false;
}
Console.WriteLine("------------------------------");
srv = new Server(SQLServerName);
try {
Console.WriteLine("Status: " + srv.Status.ToString());
return true;
} catch (Exception ex) {
Console.WriteLine("Exception: " + ex.ToString());
}
return false;
} //end SQLIsRunning()
static void Main(string[] args) {
bool result = SQLIsRunning("MST-SQL01.mst.com");
Console.WriteLine("-----------");
Console.WriteLine("Press any key to close...");
Console.ReadKey();
} //end main()
}
}
私は、データベースが理由です利用できない場合、アプリケーションで実行されるアクションを防ぎたいです。したがって、dbが接続されていない場合、アプリケーションはロックされます。 –
データベースがダウンしている場合には、このサーバに定期的にpingを実行してチェックするのではなく、データベースを停止したときにエラー処理を行うだけではどうですか(これはあまりありません。 – Paddy