测试SQL Db连接
您可以ping服务器:
http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.aspx
但这不会告诉你,如果DB是向上。打开一个连接(认证等可能是你唯一的方法)。你为什么不断地以这种方式进行投票?
不知道为什么我这样做,考虑到你很少接受答案,但是这里就是了。你的问题带来了很多问题,其中许多意味着什么。所以忍耐一下....
连接&我
连接可能意味着很多东西。 @Paddy指出,在更低层,PING会告诉您操作系统是否连接到您可以访问的网络。但是可以连接一台计算机,SQL可以停止,脱机或发生故障。 SQL可能处于联机状态,但防火墙阻止请求计算机的访问。请求的计算机可能缺少权限。名单继续。
我在这里的一点是:
打开到SQL Server的连接的能力是方法来测试连接。
如果是我,我会把一个小的ADO测试放在一个异步线程。测试会尝试使用短暂超时打开连接。
解决症状还是问题?
SQL Server确实被设计成一个高可用性产品,并且通常被设想为高可用性产品。意思是说,如果你的SQL访问量非常大,你想测试它(除了一般的错误处理程序),我会建议你解决可扩展性问题。即使是最基本的安装加上大量的厄运,也应该允许95%或更高的正常运行时间。
使用SQL SMO测试
如果我没有被这一点劝阻你,有一种替代。 SQL SMO(替代SQL DMO)是一系列允许对SQL服务器管理进行编程访问的对象。
下面的代码将需要几个对象的引用:
- Microsoft.SqlServer.ConnectionInfo.dll
- Microsoft.SqlServer.Smo.dll
- Microsoft.SqlServer.Management.Sdk.Sfc 。DLL
- Microsoft.SqlServer.SqlEnum.dll
- Microsoft.SqlServer.SQLWmiManagmenet.dll
- Microsoft.SqlServer.WmiEnum.dll
您可以使用此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()
}
}
这似乎很有用,但不是很重的操作?对不起,我对SMO没有更多的想法。所以不能多说。 – 2012-03-01 07:00:24
“不是很重” - 取决于你的观点。这是和过程中,可能网络调用,像所有的数据库连接。所以你会以毫秒为单位来测量时间,而不是纳秒。但它比等待连接超时更快。但是,我支持我的说法 - 连接是测试数据库可用性的方法。把你的连接测试放在一个异步线程上,这样你就不会在乎等待时间。 – EBarr 2012-03-01 12:31:26
我想阻止行动应用程序正在执行,如果数据库不可用,这就是为什么。所以如果数据库没有连接,应用程序将被锁定。 – 2012-02-29 14:19:34
为什么不直接为数据库关闭时的情况提供一些错误处理(我希望这种情况应该不常见),而不是使用资源不断ping这台服务器来检查? – Paddy 2012-02-29 15:52:48