测试SQL Db连接

测试SQL Db连接

问题描述:

有什么方法可以测试特定数据库服务器是否连接?像ping操作一样。测试SQL Db连接

我知道一些替代方式 - 测试SQL连接打开。不使用这种方法的原因是我的应用程序在每t秒连续测试连接。

感谢

您可以ping服务器:

http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.aspx

但这不会告诉你,如果DB是向上。打开一个连接(认证等可能是你唯一的方法)。你为什么不断地以这种方式进行投票?

+0

我想阻止行动应用程序正在执行,如果数据库不可用,这就是为什么。所以如果数据库没有连接,应用程序将被锁定。 – 2012-02-29 14:19:34

+0

为什么不直接为数据库关闭时的情况提供一些错误处理(我希望这种情况应该不常见),而不是使用资源不断ping这台服务器来检查? – Paddy 2012-02-29 15:52:48

不知道为什么我这样做,考虑到你很少接受答案,但是这里就是了。你的问题带来了很多问题,其中许多意味着什么。所以忍耐一下....

连接&我

连接可能意味着很多东西。 @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() 
    } 
} 
+0

这似乎很有用,但不是很重的操作?对不起,我对SMO没有更多的想法。所以不能多说。 – 2012-03-01 07:00:24

+0

“不是很重” - 取决于你的观点。这是和过程中,可能网络调用,像所有的数据库连接。所以你会以毫秒为单位来测量时间,而不是纳秒。但它比等待连接超时更快。但是,我支持我的说法 - 连接是测试数据库可用性的方法。把你的连接测试放在一个异步线程上,这样你就不会在乎等待时间。 – EBarr 2012-03-01 12:31:26