有没有办法测试特定数据库服务器是否已连接?就像ping操作一样。
我知道一些替代方法 - 测试SQL连接打开。不使用该方法的原因是我的应用程序在每t秒连续测试连接。
由于
答案 0 :(得分:1)
不知道为什么我这样做,考虑到你很少接受答案,但是这里有。你的问题提出了许多问题,许多暗示。所以忍受我......
连接性&我强>
连接可能意味着很多事情。在@Paddy指出的更低层,PING将告诉您操作系统是否已连接到您可以访问的网络。但是可以连接计算机并且SQL可以停止,脱机或以其他方式发生故障。 SQL可以在线,但防火墙会阻止来自请求计算机的访问。请求计算机可能缺少权限。名单还在继续。
我的观点是:
打开与SQL Server的连接的能力是 方法 来测试连接性。
如果是我,我会在异步线程上放置一个小的ADO测试。测试将尝试使用短暂超时打开连接。
解决症状或问题?
SQL Server确实是作为高可用性产品而设计的,并且通常被认为是。这意味着,如果你的SQL访问量太大而你想要测试它(超出一般的错误处理程序),我建议你解决可用性问题。即使最基本的安装加上许多运气不好也应该允许95%或更高的正常运行时间。
使用SQL SMO进行测试
如果我在这一点上没有劝阻你,还有另一种选择。 SQL SMO(SQL DMO的替代品)是一系列允许以编程方式访问SQL Server管理的对象。
以下代码需要引用一些对象:
您可以使用此getting started文章了解如何设置项目。请注意,您需要WINDOWS权限(而不是SQL身份验证)才能连接到相关的SQL Server。
现在进入代码:
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()
}
}
答案 1 :(得分:0)
您可以ping服务器:
http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.aspx
但是这不会告诉你数据库是否已启动。打开连接(验证等可能是你唯一的方法)。你为什么要这样不断地进行民意调查?