.net 测试SQL数据库连接
有没有办法测试特定的数据库服务器是否已连接?像ping操作 我知道一些替代方法-测试SQL连接打开。不使用这种方法的原因是我的应用程序在每t秒测试一次连接 谢谢您可以ping服务器:.net 测试SQL数据库连接,.net,sql,.net,Sql,有没有办法测试特定的数据库服务器是否已连接?像ping操作 我知道一些替代方法-测试SQL连接打开。不使用这种方法的原因是我的应用程序在每t秒测试一次连接 谢谢您可以ping服务器: 但这不会告诉你DB是否启动。打开连接(进行身份验证等)可能是您的唯一方法。你为什么总是这样做?考虑到你很少接受答案,我不知道我为什么要这样做,但还是这样。你的问题提出了很多问题,很多都是隐含的。所以请容忍我 连接和Me 连通性可能意味着很多事情。正如@Paddy指出的,在较低的一层,PING将告诉您操作系统是否连
但这不会告诉你DB是否启动。打开连接(进行身份验证等)可能是您的唯一方法。你为什么总是这样做?考虑到你很少接受答案,我不知道我为什么要这样做,但还是这样。你的问题提出了很多问题,很多都是隐含的。所以请容忍我 连接和Me 连通性可能意味着很多事情。正如@Paddy指出的,在较低的一层,PING将告诉您操作系统是否连接到您可以访问的网络。但计算机可以连接,SQL可以停止、脱机或出现其他故障。SQL可以联机,但防火墙会阻止请求计算机的访问。请求的计算机可能缺少权限。这个名单还有很多 我的观点是: 打开与SQL Server的连接的能力是测试连接性的方法 如果是我,我会在异步线程上进行一个小ADO测试。测试将尝试使用短超时打开连接 解决症状还是问题? SQL Server实际上是作为一种高可用性产品设计的,并且通常被认为是一种高可用性产品。也就是说,如果您的SQL访问非常频繁,以至于您想要对其进行测试(除了一般的错误处理程序之外),我建议您解决兼容性问题。即使是最基本的安装,再加上大量的坏运气,也应该允许95%或更高的运行时间 使用SQL SMO进行测试 如果我没有在这一点上劝阻你,还有一个选择。SQL SMO(SQL DMO的替代品)是一系列允许对SQL server管理进行编程访问的对象 下面的代码需要引用一些对象:
- Microsoft.SqlServer.ConnectionInfo.dll
- Microsoft.SqlServer.Smo.dll
- Microsoft.SqlServer.Management.Sdk.Sfc.dll
- Microsoft.SqlServer.SqlEnum.dll
- Microsoft.SqlServer.sqlwmimagnamenet.dll
- Microsoft.SqlServer.WmiEnum.dll
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()
}
}
我想防止在数据库不可用的情况下在应用程序中执行操作,这就是为什么。因此,如果数据库未连接,应用程序将被锁定。为什么不在数据库关闭的情况下提供一些错误处理(我希望这种情况不经常发生),而不是使用资源不断ping此服务器进行检查?这似乎很有用,但不是很繁重的操作吗?对不起,我对SMO一无所知。所以不能再多说了,“这不是很重吗”——这取决于你的观点。它是和进程外的,很可能是网络调用,就像所有数据库连接一样。所以你要用毫秒来测量时间,而不是纳秒。但这比等待连接超时要快得多。然而,我坚持我的主张——连接是测试DB可用性的方法。将连接测试放在异步线程上,这样就不必关心等待时间。