質問
SQLサーバーのリストが稼働しているかどうかを判断するコードを記述しようとしています。各サーバーのWMI、SQLDMO、SqlDataSourceEnumerator、およびPingポート1433を試しましたが、成功の度合いはさまざまです(以下の結果を参照)。
SQLDMOとSqlDataSourceEnumeratorを使用して、6つのうち3つを見つけました。3つの欠落したSQLサーバーのうち2つがクラスターを形成していると言わざるを得ません。
pingポート1433は6つのうち4つを検出し、2つはSQLクラスターを形成する2つのサーバーです。
WMIは、6つのサーバーのうち1つしか検出されなかったという点で、最も成功率が低いことが判明しました。
サーバー検出のプロトタイプを作成するために使用したコードは次のとおりです。
private void buildServerMap(bool useLibCOM)
{
sqlServersMap = new Dictionary<string, string>();
if (useLibCOM)
{
//get all available SQL Servers
SQLDMO.Application sqlApp = new SQLDMO.ApplicationClass();
SQLDMO.NameList sqlServers = sqlApp.ListAvailableSQLServers();
ArrayList servs = new ArrayList();
for (int i = 0; i < sqlServers.Count; i++)
{
object srv = sqlServers.Item(i + 1);
if (srv != null)
{
sqlServersMap.Add(srv.ToString(), srv.ToString());
}
}
}
else
{
System.Data.Sql.SqlDataSourceEnumerator enumSQL = System.Data.Sql.SqlDataSourceEnumerator.Instance;
System.Data.DataTable table = enumSQL.GetDataSources();
foreach (System.Data.DataRow row in table.Rows)
{
foreach (System.Data.DataColumn col in table.Columns)
{
sqlServersMap.Add((string)row[col], (string)row[col]);
}
}
}
}
private bool pingSqlServer(string server)
{
bool success = false;
TcpClient client = new TcpClient();
try
{
client.Connect(server, 1433);
success = true;
}
catch (Exception)
{
//throw;
}
return success;
}
public StringBuilder buildWmiServerList(string path, string sqlServer, string sqlServerServiceName, StringBuilder sb, out bool reportNeeded)
{
reportNeeded = false;
try
{
ManagementScope ms = new ManagementScope(path);
ms.Connect();
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Service WHERE Started = TRUE AND DisplayName='" + sqlServerServiceName + "'");
searcher.Scope = ms;
if (searcher != null && searcher.Get() != null)
{
foreach (ManagementObject service in searcher.Get())
{
sb.Append(sqlServer + " SQL Server service - RUNNING\n");
}
}
}
catch (Exception e)
{
sb.Append(sqlServer + " SQL Server service - UNVERIFIABLE\n");
reportNeeded = true;
}
return sb;
}
SQLクラスターを形成するSQLサーバーを解決/検出する方法のアイデアはありますか
解決
私はとにかく廃止されたDMOについては知りませんが、SMOではServer.IsClusteredを実行できます。
他のヒント
SQL ping を試してみませんか?ソースコードがここにあるので、どのように実行されるかを確認できます。
とにかく、いくつかの考え:
物理サーバー、クラスター名、または仮想サーバー名(phys1、phys2、vclus、vserv1、vserv2など)を試行していますか(アクティブ/アクティブを想定)?
クライアントからtcpまたは名前付きパイプを使用していますか? tcp:vserv1を試しましたか? たとえば、名前付きパイプは、クラスターIIRCで無効にしてから有効にすると、おかしくなります。 使用されているプロトコルは、SQLログと使用されているtcpポートにリストされます(名前はinstance = random)
クライアントでシステムDSNを作成できますか?これから、HKLM \ SW \ Microsoft \ MSSQLServerで使用されているポートとプロトコルを調べることができます